JavaWeb知识总结|过滤器和监听器

55 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

过滤器和监听器

Filter

1.概述

  • Filter称为过滤器,位于客户端与处理程序之间,能够对请求和响应进行检查和修改

  • 当客户端对服务器资源发送请求时,服务器根据过滤规则进行检查,如果满足过滤规则,则对客户请求进行拦截,然后对请求头或请求数据进行修改或检查,并依次通过Filter链,最后将请求交给处理程序

  • 请求信息可以在过滤器中被修改,也可以根据请求条件不让请求发往处理程序

  • 拦截过程

    Filter

2.Filter接口

  • 编写一个Filter必须实现Filter接口

  • 相关方法

    方法名说明
    default void init(FilterConfig filterConfig)创建Filter后用于初始化Filter,通过参数FilterConfig对象获取配置参数
    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3)用于完成过滤的操作,其中Request对象和Response对象是由上一个过滤器或者Web服务器传递过来的请求和响应对象,FilterChain对象代表当前过滤链对象
    default void destroy()用于释放过滤器中占用的资源,在对象被销毁之前调用
    • Filter接口提供了三个方法,其中init()方法和destroy()方法是默认方法不强制重写,而doFilter()方法是抽象方法,在实现Filter接口时必须重写

3.Filter配置

  • 配置Filter有两种方式,一种是通过web.xml文件进行配置,一种是通过@WebFilter注解进行配置

  • web.xml配置方式

    <!--在web.xml文件的web-app标签下写入以下内容-->
    <filter>
        <filter-name>FilterDemo</filter-name>
        <filter-class>com.liaoxiangqian.filter.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo</filter-name>
        <url-pattern>/ServletDemo</url-pattern>
    </filter-mapping>
    
  • @WebFilter注解配置方式

    @WebFilter("/ServletDemo")
    public class FilterDemo implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("FilterDemo执行了");
        }
    }
    

    @WebFilter常用属性

    属性名类型说明
    filterNameString指定过滤器名称
    urlPattrenString[]指定需要过滤的资源,如某个Servlet或Jsp
    valueString[]等价于urlPattern,不能同时使用
    servletNamesString[]指定过滤器将应用于哪些Servlet,取值是@WebServlet中name属性的取值
    dispatcherTypesDispatcherType指定过滤器转发模式,取值有ERROR、FORWARD、INCLUDE、REQUEST
    initParamsWebInitParam[]指定过滤器的一组初始化参数
    • 注意

      1. DispatcherType是枚举类,取值的作用如下:
      2. DispatcherType.ERROR表示过滤器拦截那些跳转到某个异常处理页面的请求
      3. DispatcherType.FORWARD表示过滤器拦截那些通过forward()方法来请求的转发的请求
      4. DispatcherType.INCLUDE表示过滤器拦截那些通过include()方法来请求包含的请求
      5. DispatcherType.REQUEST表示过滤器只会拦截普通的请求,而请求转发和请求包含类的请求不会拦截
    • 如果需要拦截用户的所有请求,则可以使用*号通配符,如

      <url-pattern>/*</url-pattern>
      
      @WebFilter("/*")
      

4.FilterConfig接口

  • FilterConfig接口用于封装Filter的配置信息,在Filter初始化时,服务器将FilterConfig对象作为参数传递给Filter对象的init()方法

  • FilterConfig相关方法

    方法名说明
    String getFilterName()获取Filter的名称
    ServletContent getServletContext()获取ServletContext对象
    String getInitParameter(String name)根据名称获取初始化参数值
    Enumeration getInitParameterNames()返回一个包含所有初始化参数名的Enumeration对象
  • 配置初始化参数的方式

    • 在web.xml中配置,注意是在标签下方进行配置

      <init-param>
           <param-name>username</param-name>
           <param-value>liaoxiangqian</param-value>
      </init-param>
      
    • 在@WebFilter中使用initParams属性配置

      @WebFilter(initParams = {@WebInitParam(name="username",value="liaoxiangqian")})
      

      注意initParams属性类型是注解型数组

  • 添加初始化的参数后可以通过FilterConfig来获取这些参数

5.FilterChain接口

  • FilterChain对象表示当前过滤器所在的过滤链

  • 一个Web应用程序中存在多个Filter,每个Filter都可以对某个请求进行拦截,如果多个Filter都对同一个请求进行拦截,那么这些Filter就组成一个Filter链,使用FilterChain对象表示

  • 一个方法

    void doFilter(ServletRequest var1, ServletResponse var2)

    FilterChain提供的doFilter()方法,作用是让Filter链上的当前过滤器放行,使请求进入下一个Filter

6.Filter生命周期

  • Filter生命周期可以分为创建、执行、销毁三个阶段
  • 创建阶段:Web服务器启动的时候会创建Filter对象,并调用init()方法,完成对象的初始化,在一次完整请求中Filter对象只会被创建一次,init()方法只会被调用一次
  • 执行阶段:客户端发出请求时,服务器筛选出符合拦截条件的过滤器,按照类名的顺序依次执行doFilter()方法,doFilter()在一次完整请求中会执行多次
  • 销毁阶段:服务器关闭时,Web服务器调用destroy()方法销毁对象

Listener

1.概述

  • Web程序开发中,可以对对象的创建和销毁、域对象中属性的变化、会话相关内容进行监听

  • Servlet中提供八个监听器,都是以接口的形式提供,具体功能需要自行完善

  • 相关概念

    1. 事件:触发的动作
    2. 事件源:产生事件的对象
    3. 事件监听器:监听发生在事件源上的事件
    4. 事件处理器:监听器的成员方法,事件发生时会触发该方法

2.监听对象的创建和销毁的监听器

  • ServletContextListener接口

    1. 用于监听ServletContext对象的创建与销毁

    2. 核心方法

      方法说明
      void contextInitialized(ServletContextEvent sce)ServletContext对象创建时执行
      void contextDestroyed(ServletContextEvent sce)ServletContext对象销毁时执行
  • HttpSessionListener接口

    1. 用于监听HttpSession对象的创建与销毁

    2. 核心方法

      方法说明
      void sessionCreated(HttpSessionEvent se)HttpSession对象创建时执行
      void sessionDestroy(HttpSessionEvent se)HttpSession对象销毁时执行
  • ServletRequestListener接口

    1. 用于监听ServletRequest对象的创建与销毁

    2. 核心方法

      方法说明
      void requestInitialized(ServletRequestEvent sre)ServletRequest对象创建时执行
      void requestDestroyed(ServletRequestEvent sre)ServletRequest对象销毁时执行

3.监听域对象属性变化的监听器

  • ServletContextAttributeListener接口

    1. 用于监听ServletContext中属性的变化

    2. 核心方法

      方法说明
      void attributeAdded(ServletContextAttributeEvent scae)域中添加属性时执行
      void attributeRemoved(ServletContextAttributeEvent scae)域中移除属性时执行
      void attributeReplaced(ServletContextAttributeEvent scae)域中替换属性时执行
  • HttpSessionAttributeListener接口

    1. 用于监听HttpSession中属性的变化

    2. 核心方法

      方法说明
      void attributeAdded(HttpSessionBindingEvent se)域中添加属性时执行
      void attributeRemoved(HttpSessionBindingEvent se)域中移除属性时执行
      void attributeReplaced(HttpSessionBindingEvent se)域中替换属性时执行
  • ServletRequestAttributeListener接口

    1. 用于监听ServletRequest中属性的变化

    2. 核心方法

      方法说明
      void attributeAdded(ServletRequestAttributeEvent srae)域中添加属性时执行
      void attributeRemoved(ServletRequestAttributeEvent srae)域中移除属性时执行
      void attributeReplaced(ServletRequestAttributeEvent srae)域中替换属性时执行

4.监听会话相关的感知型监听器

  • HttpSessionBindingListener接口

    1. 用于监听JavaBean对象绑定到HttpSession对像和从HttpSession对象解绑的事件

    2. 核心方法

      方法说明
      void valueBound(HttpSessionBindingEvent event)数据绑定(添加)到会话域时执行
      void valueUnbound(HttpSessionBindingEvent event)数据从会话域解绑(移除)时执行
  • HttpSessionActivationListener接口

    1. 用于监听HttpSession中对象活化(恢复到内存)和钝化(持久化到硬盘)的过程

    2. 核心方法

      方法说明
      void sessionWillPassivate(HttpSessionEvent se)会话域中数据钝化时执行
      void sessionDidActivate(HttpSessionEvent se)会话域中数据活化时执行

5.监听器的实现

  • 步骤

    1. 将监听器绑定到事件源,也就是注册监听器
    2. 监听器监听到事件发生时,将事件对象作为参数传给相关的成员方法
    3. 成员方法可以根据事件对象获取事件源,然后进行处理
  • 注册监听器的方式有两种,一种是通过web.xml文件,一种是通过注解的方式

    1. 通过web.xml注册

      <!--<listener-class>标签中写的是监听器的实现类的全限定名类名-->
      <listener>
              <listener-class>com.liaoxiangqian.listener.MyListener</listener-class>
      </listener>
      
    2. 通过注解注册

      //在监听器实现类上方使用该注解进行注册
      @WebListener