Filter、Listener学习笔记

java web的三大组件:

  • Filter:过滤器
  • Listener:监听器
  • Servlet

Filter

过滤器是处于客户端与服务器资源文件之间的一道过滤网,当访问服务器资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

过滤器的作用

用于完成通用的操作。如:登陆验证、统一编码处理、敏感字符过滤...便于代码重用,不必每个servlet中还要进行相应的操作。

步骤

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

  2. 重写方法

  3. 配置拦截路径

    1. 注解
    import javax.servlet.*;//Filter包不要导错
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter("/*")//拦截所有请求
    public class FilterDemo 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("过滤器执行了");
            filterChain.doFilter(servletRequest,servletResponse);//过滤器放行
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    1. web.xml

    在web.xml中,监听器 > 过滤器 > servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。

        <filter>
            <filter-name>demo1</filter-name><!--过滤器名称-->
            <filter-class>com.gs.loginFilter</filter-class><!--过滤器类的包路径-->
            <async-supported>true</async-supported><!--servlet 3.0后推出的新特性,支持异步处理。-->
            <init-param><!--可选-->
            <param-name>参数名</param-name><!--过滤器初始化参数-->
            <param-value>参数值</param-value>
            </init-param>
        </filter>
    
        <filter-mapping><!--过滤器映射-->
            <filter-name>loginFilter</filter-name>
                <url-pattern>指定过滤器作用的对象</url-pattern>
        </filter-mapping>
    

过滤器执行流程

  1. 执行过滤器
  2. 执行放行后的资源
  3. 执行过滤器放行代码后的代码

过滤器生命周期

  1. init:服务器启动时,会创建Filter对象。然后调用init()方法,用于加载资源,只执行一次。
  2. doFilter:每次请求资源被拦截时,调用doFilter()方法。
  3. destroy:服务器关闭后,Filter对象被销毁,如果服务器正常关闭,执行destroy()方法,释放资源,只执行一次。

拦截路径配置

  1. 具体资源路径:/index.jsp 访问index.jsp资源时,过滤器执行
  2. 拦截目录:/user/* 访问/user下的所有资源时,过滤器执行
  3. 后缀名拦截:*.jsp 访问所有jsp资源时,过滤器执行
  4. 拦截所有资源:/*

拦截方式的配置

设置dispatcherTypes属性

  1. REQUEST:默认值,浏览器直接请求访问资源

  2. FORWARD:转发访问资源

  3. INCLUDE:包含访问资源

  4. ERROR:错误跳转资源

  5. ASYNC:异步访问资源

    • 注解
    //浏览器直接请求访问index.jsp页面时,该过滤器执行。
    @WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST)
    
    //浏览器转发访问index.jsp页面时,该过滤器执行。
    @WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.FORWARD)
    
    //浏览器直接请求访问index.jsp页面 或 转发访问index.jsp页面时,该过滤器执行。
    @WebFilter(value = "/index.jsp", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})
    
    • web.xml

      添加dispatcher标签,

    <filter-mapping><!--过滤器映射-->
        <filter-name>demo1</filter-name>
        <url-pattern>指定过滤器作用的对象</url-pattern>
        <dispatcher>REQUEST</dispatcher><!--FORWARD, INCLUDE, REQUEST, ASYNC, ERROR-->
    </filter-mapping>
    

过滤器链

配置多个过滤器

  1. 执行步骤

    假如有两个过滤器,A和B,A先执行,B后执行

    graph LR A执行-->B执行 B执行-->资源执行 资源执行-->B执行 B执行-->A执行
  2. 执行顺序

    • 注解配置:

      按照类名的字符串比较,字符串逐个字符比较大小,值小的先执行

    • web.xml配置:

      按照定义的先后顺序执行

案例

1. 登录验证

需求

  1. 访问登陆案例的资源,验证其是否登录
  2. 如果登录,则直接放行
  3. 如果没有登陆,则跳转到登陆页面,提示“尚未登陆,请先登录”

Listener

概念:

web三大组件之一

事件监听机制

  • 事件:一件事情

  • 事件源:事件发生的地方

  • 监听器:一个对象

  • 注册监听:将事件、事件源、监听器绑定在一起,当事件源上发生某个时间后,执行监听代码。

步骤

  1. 定义一个类,实现ServletContextListener接口

  2. 重写方法

  3. 配置

    1. web.xml

      <!--  配置监听器  -->
      <listener>
              <listener-class>com.java.listener.FirstListener</listener-class>
      </listener>
      <!--  配置初始化参数  -->
      <context-param>
          <param-name>initParam</param-name>
          <param-value>listener</param-value>
      </context-param>
      
    2. 注解

      @WebListener
      

ServletContextListener

监听ServletContext对象的创建和销毁

方法:

void contextInitialized(ServletContextEvent sce)//ServletContext对象创建后,会调用
void contextDestroyed(ServletContextEvent sce)//ServletContext对象被销毁之前,会调用该方法
原文地址:https://www.cnblogs.com/fengxiaoqi/p/12857633.html