• JavaWeb之Fliter & Listener


    Fliter & Listener

    Listener

    监听器

    作用

    监听某一事件的发生。状态的改变。

    监听器内部实现机制

    接口回调

    接口回调

    A在执行循环,当循环到5的时候, 通知B。

    事先先把一个对象传递给 A , 当A 执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。

    在这里插入图片描述

    web监听器

    8个,3类

    如何创建监听器

    定义一个类,实现相关的监听器接口,然后在web.xml中配置。

    也可以直接通过编译器创建。

    监听作用域的创建和销毁

    作用域 ------ 对应的类 ------- 对应的监听器接口

    request — httpServletRequest ----- ServletRequestListener

    session — httpSession ---- HttpSessionListener

    application — ServletContext------- ServletContextListener

    1.request — httpServletRequest ----- ServletRequestListener

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    
    public class listenertest2 implements ServletRequestListener{
        //监听作用域对象的销毁
    	public void requestDestroyed(ServletRequestEvent sre) {
            //这样写是为了直观看到监听器是否被使用,实际项目中根据需求书写
    		System.out.println("RequestListener 销毁了");
    	}
        //监听作用域对象的创建
    	public void requestInitialized(ServletRequestEvent sre) {
            //这样写是为了直观看到监听器是否被使用,实际项目中根据需求书写
    		System.out.println("RequestListener 创建了");
    	}
    }
    
    作用

    监听request对象的创建和销毁

    作用域
    request创建:
    	访问服务器上的任意资源都会有请求出现。
    		访问 html: 会
    		访问 jsp:	会
    		访问 servlet : 会 
    request销毁:	
    	服务器已经对这次请求作出了响应。
    

    2.session — httpSession ---- HttpSessionListener

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    public class listenertest3 implements HttpSessionListener{
        //监听作用域对象的创建
    	public void sessionCreated(HttpSessionEvent se) {
    		System.out.println("SessionListener 创建了");
    	}
        //监听作用域对象的销毁
    	public void sessionDestroyed(HttpSessionEvent se) {
    		System.out.println("SessionListener 销毁了");
    	}
    }
    
    作用

    监听session对象的创建与销毁

    统计在线人数.

    作用域
    session的创建
    	只要调用getSession
    		html:		不会
    		jsp:		会	  getSession();
    		servlet: 	会
    session的销毁
    	超时  30分钟		
    	非正常关闭 销毁
    
    ​	正常关闭服务器(序列化)
    

    3.application — ServletContext------- ServletContextListener

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    public class listenertest1 implements ServletContextListener{
        //监听作用域对象的创建
    	public void contextInitialized(ServletContextEvent sce) {
    		System.out.println("ContextListener 创建了");
    	}
        //监听作用域对象的销毁
    	public void contextDestroyed(ServletContextEvent sce) {
    		System.out.println("ContextListener 销毁了");
    	}
    }
    
    作用

    监听application 对象的创建与销毁

    利用它来,在servletcontext创建的时候,

    1. 完成自己想要的初始化工作
    2. 执行自定义任务调度。 执行某一个任务。 Timer
    作用域

    servletcontext创建:

    ​ 启动服务器的时候

    servletContext销毁:

    ​ 关闭服务器. 从服务器移除项目

    监听三个作用域属性状态变更

    作用域 --------- 对应监听其属性的监听器接口

    servletContext — ServletContextAttributeListener

    request — ServletRequestAttributeListener

    session — HttpSessionAttributeListener

    servletContext — ServletContextAttributeListener

    在这里插入图片描述

    request — ServletRequestAttributeListener

    在这里插入图片描述

    session — HttpSessionAttributeListener

    在这里插入图片描述

    监听HttpSession中的存值状态

    这一类监听器不用注册

    HttpSessionBindingListener

    1. 让javaBean 实现该接口即可
    
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
    	System.out.println("对象被绑定进来了");
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
    	System.out.println("对象被解除绑定");
    }
    
    作用

    监听对象与session 绑定和解除绑定 的动作

    HttpSessionActivationListener

    import java.io.Serializable;
    
    import javax.servlet.http.HttpSessionActivationListener;
    import javax.servlet.http.HttpSessionEvent;
    
    public class bean02 implements HttpSessionActivationListener,Serializable {
    	int a;
    	public bean02(int a) {
    		super();
    		this.a = a;
    	}
        //get和set方法得写上不然通过jsp的EL表达式取不到值
    	public int getA() {
    		return a;
    	}
    	public void setA(int a) {
    		this.a = a;
    	}
    	public void sessionWillPassivate(HttpSessionEvent se) {
    		System.out.println("sessoin 钝化");
    	}
    	public void sessionDidActivate(HttpSessionEvent se) {
    		System.out.println("sessoin 活化");
    	}
    }
    
    作用

    用于监听现在session的值 是 钝化 (序列化)还是活化 (反序列化)的动作

    钝化 (序列化)

    把内存中的数据 存储到硬盘上

    活化 (反序列化)

    把硬盘中的数据读取到内存中。

    session的钝化活化的用意何在

    session中的值可能会很多, 并且我们有很长一段时间不使用这个内存中的值, 那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】

    如何让session的在一定时间内钝化.

    做配置即可

    1. 在tomcat里面 conf/context.xml 里面配置
    
    		对所有的运行在这个服务器的项目生效  
    
    2. 在conf/Catalina/localhost/context.xml 配置
    
    		对 localhost生效。  localhost:8080
    
    3. 在自己的web工程项目中的 META-INF/context.xml
    
    		只对当前的工程生效。
    
    	maxIdleSwap : 1分钟不用就钝化
    	directory :  钝化后的那个文件存放的目录位置,可自定义。 
    
    		D:	omcatapache-tomcat-7.0.52workCatalinalocalhostListenerDemowf
    
    	<Context>
    		<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
    			<Store className="org.apache.catalina.session.FileStore" directory="wf"/>
    		</Manager>
    	</Context>
    

    Filter

    过滤器,对客户端发出的请求进行过滤。在浏览器发出请求后,就由过滤器进行过滤,然后才交给servlet处理。其实过滤器起到拦截作用。

    作用
    1. 对一些敏感词汇进行过滤
    2. 统一设置编码
    3. 自动登录

    如何使用filter

    1.定义一个类实现Filter接口

    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    public class filter02 implements Filter {
    
        //过滤器销毁时调用
    	public void destroy() {
    		
    	}
    	//在执行过滤时调用
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    		System.out.println("fliter02");
            //chian的作用是当过滤器检测后,如果不用把请求过滤掉,那么就使用chain把请求传递到下一个地方。
    		chain.doFilter(request, response);
    	}
    	//过滤器创建时调用
    	public void init(FilterConfig fConfig) throws ServletException {
            
    	}
    }
    

    2.过滤器注册

    在web.xml中注册和servlet注册方法基本一样

      <filter>
        <display-name>FilterDemo</display-name>
        <filter-name>filter02</filter-name>
        <filter-class>test4.filter02</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>filter02</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    Filter的生命周期

    创建

    ​ 在服务器启动的时候就创建。

    销毁

    ​ 服务器停止的时候。

    Filter执行顺序

    1. 客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet
    2. 如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。 只要有一个过滤器, 不放行,那么后面排队的过滤器以及咱们的servlet都不会收到请求。

    Filter细节:

    1. init方法的参数 FilterConfig , 可以用于获取filter在注册的名字 以及初始化参数。 其实这里的设计的初衷与ServletConfig是一样的。
    2. 如果想放行,那么在doFilter 方法里面操作,使用参数 chain
    	chain.doFilter(request, response); 放行, 让请求到达下一个目标。
    
    1. /* 写法格式与servlet一样。

      1. 全路径匹配 以 / 开始

        /LoginServlet

      2. 以目录匹配 以 / 开始 以 * 结束

        /demo01/*

      3. 以后缀名匹配 以 * 开始 以后缀名结束

        *.jsp *.html *.do

    2. 针对 dispatcher 设置
      在这里插入图片描述

      REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
      FORWARD : 只要是转发都拦截。
      ERROR : 页面出错发生跳转
      INCLUDE : 包含页面的时候就拦截。

  • 相关阅读:
    网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+
    MySQL数据库读写分离、读负载均衡方案选择
    ubuntu14.04无法安装Curl,需要先升级sudo apt-get update
    PHP获取6位数随机数,获取redis里面不存在的6位随机数(设置24小时过时)
    升级到php7相关问题,日请求过亿QQ会员活动平台PHP7升级实践
    干货阿里巴巴 开源软件列表,先收藏起来
    让前端独立于后端进行开发,模拟数据生成器Mock.js
    左连接LEFT JOIN 连接自己时的查询结果测试
    禁止火狐浏览器缓存input标签方法
    Jquery图片上传组件,支持多文件上传
  • 原文地址:https://www.cnblogs.com/wf614/p/11673837.html
Copyright © 2020-2023  润新知