Filter&Listener

Filter:过滤器
  1. 概念:
    当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
    过滤器的作用:
      一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...

  2. 使用:
    1. 定义一个类,实现接口Filter
    2. 复写方法
    3. 配置拦截路径

      1. web.xml配置
        <filter>
          <filter-name>demo1</filter-name>
          <filter-class>com.fgy.web.filter.FilterDemo1</filter-class>
        </filter>
        <filter-mapping>
          <filter-name>demo1</filter-name>
          <!-- 拦截路径 -->
          <url-pattern>/*</url-pattern>
        </filter-mapping>
      2. 注解
        @WebFilter("/*")  //访问所有资源之前,都会执行该过滤器
        public class FilterDemo1 implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
          }
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("filterDemo1被执行了....");
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
          }
          @Override
          public void destroy() {
          }
        }

  3. 过滤器执行流程
    1. 执行过滤器
    2. 执行放行后的资源
    3. 回来执行过滤器放行代码下边的代码
  4. 过滤器生命周期方法
    1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
    2. doFilter:每一次请求被拦截资源时,会执行。执行多次
    3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
  5. 过滤器配置详解
    拦截路径配置:
      1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
      2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
      3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
      4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
    拦截方式配置:资源被访问的方式
      注解配置:
        设置dispatcherTypes属性
          1. REQUEST:默认值。浏览器直接请求资源
          2. FORWARD:转发访问资源
          3. INCLUDE:包含访问资源
          4. ERROR:错误跳转资源
          5. ASYNC:异步访问资源
         web.xml配置
          设置<dispatcher></dispatcher>标签即可
  6. 过滤器链(配置多个过滤器)
    执行顺序:如果有两个过滤器:过滤器1和过滤器2
      过滤器1 -> 过滤器2 -> 资源执行 -> 过滤器2 -> 过滤器1

    过滤器先后顺序问题:

      1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
      2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行


Listener:监听器
  概念:web的三大组件之一。
    事件监听机制
      事件 :一件事情
      事件源 :事件发生的地方
      监听器 :一个对象
      注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

  

  类型一: 监听三个作用域创建和销毁

    ServletContextListener:监听ServletContext对象的创建和销毁
      方法:
        void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
        void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
      步骤:
        1. 定义一个类,实现ServletContextListener接口
        2. 复写方法
        3. 配置
          1. web.xml
            <listener>
              <listener-class>com.fgy.web.listener.ContextLoaderListener</listener-class>
            </listener>

          2. 注解:
            @WebListener

        例:监听到ServletContext对象的创建时加载ServletContext初始化参数

          配置ServletContext初始化参数:     

            <context-param>
            <param-name>name</param-name>
            <param-value>value</param-value>
            </context-param>

          获取ServletContext初始化参数:

             servletContext.getInitParameter("name");

    HttpSessionListener:......

    ServletRequestListener:......

  类型二: 监听三个作用域属性状态变更

    可以监听在作用域中值 添加  | 替换  | 移除的动作

    ServletContextAttributeListener:

    HttpSessionAttributeListener:

    ServletRequestAttributeListener:

    

  类型三: 监听httpSession里面存值的状态变更  这一类监听器不用配置。 

    HttpSessionBindingListener
      作用:监听对象与session 绑定和解除绑定的动作
      用法:让javaBean 实现该接口即可

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
 
public class Bean01  implements HttpSessionBindingListener{
    private String name ;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("对象被绑定进来了");
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("对象被解除绑定");
    }
}

    HttpSessionActivationListener
      作用:用于监听现在session的值是钝化 (序列化, 把内存中的数据存储到硬盘上) 还是活化 (反序列化, 把硬盘中的数据读取到内存中) 的动作。

    session的钝化活化的意义:

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

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
 
public class Bean02  implements HttpSessionActivationListener , Serializable{
     private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("session中的值被钝化了...");
    }
    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("session中的值被活化了...");    
    }
}
原文地址:https://www.cnblogs.com/roadlandscape/p/12241722.html