Java EE-06-Filter和Listener

1. Filter

  1. Filter功能:
    1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据
    2. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据
  2. 过滤器在doFilter方法中执行过滤,每个过滤器都可以访问一个FilterConfig对象,从中获取初始化参数,以及一个对ServletContext的引用
  3. Filter仅在配置它的项目中生效

1.1 Filter使用

  1. 创建javax.servlet.Filter接口实现类

    public class FilterImpl implements Filter {
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            // 统一设置请求的编码方式
            req.setCharacterEncoding("UTF-8");
            // 统一设置响应的编码方式(这种硬编码解决响应乱码的方式会导致下载功能出现问题)
            resp.setContentType("text/html;charset=UTF-8");
            // 放行
            chain.doFilter(req, resp);
        }
    
        public void init(FilterConfig config) throws ServletException {
        }
    }
    
  2. 配置该实现类的过滤路径:

    1. 配置文件方式:在web.xml的web-app标签里配置Filter实现类的过滤路径

      <!--配置Filter实现类的信息-->
      <filter>
          <!--配置Filter名称,可以任意,但建议与类名相同-->
          <filter-name>FilterImpl</filter-name>
          <!--配置Filter类的全路径-->
          <filter-class>com.liu2m.filter.FilterImpl</filter-class>
      </filter>
      <!--配置Filter映射关系-->
      <filter-mapping>
          <!--配置关联的Filter名称,要和上面配置的实现类信息相对应-->
          <filter-name>FilterImpl</filter-name>
          <!--配置过滤路径:指定过滤哪些请求,可配置多个
          过滤路径只能是本项目中的路径,且不用写本项目虚拟路径
          绝对匹配*:/path
          目录匹配:/a/b/*
          扩展名匹配:*.后缀
          缺省匹配:/      除了jsp以外的都能匹配
          目录匹配和扩展名匹配不能同时使用
          -->
          <url-pattern>/</url-pattern>
      </filter-mapping>
      
    2. 注解方式:在该实现类上添加@WebFilter("过滤路径")

      @WebFilter(urlPatterns = {"/uri1", "/uri2", "/uri3"})
      

1.2 Filter生命周期

  1. init方法:服务器启动时会调用init方法初始化Filter对象
    1. FilterConfig对象可以获取Filter的初始化参数
  2. doFilter方法:每次匹配过滤路径到的请求,Filter都会调用doFilter()方法进行过滤
  3. destroy方法:服务器正常关闭或项目从服务器移除时,会调用destory方法销毁Filter对象

1.3 过滤方式

dispatcherTypes属性值:

  1. DispatcherType.REQUEST:默认值,只过滤来自客户端的请求(如:浏览器直接请求、重定向、等)
  2. DispatcherType.FORWARD:只过滤转发的请求
  • 一般情况下不过滤转发,直接使用默认值的情况偏多
@WebFilter(dispatcherTypes = {DispatcherType.FORWARD, DispatcherType.REQUEST})

1.4 过滤器链

  1. 过滤器链作用:一个请求可能被多个过滤器所过滤,只有当所有过滤器都放行,请求才能到达目标资源,如果有某一个过滤器没有放行,那么请求就无法到达后续过滤器以及目标资源
  2. 过滤器链执行顺序:
    1. 配置文件:按照配置文件中filter-mapping的书写顺序执行
    2. 注解方式:按照Filter类名的首字母顺序执行

2. Listener

JavaWeb中的监听器可以监听域对象的状态,事件源和监听器的绑定通过配置web.xml完成

2.1 Listener使用

  1. 创建监听器接口实现类

  2. 绑定事件源和监听器:

    1. 在web.xml的web-app标签里绑定:

      <listener>
          <!--配置监听器的全路径-->
          <listener-class>com.liu2m.listener.SclImpl</listener-class>
      </listener>
      
    2. 注解方式绑定:在实现类上添加@WebListener

  3. 事件对象(如:servletContextEvent),可以获取事件源(如:ServletContext)

2.2 常用监听器

  1. ServletContextListener监听器可以监听ServletContext域对象的创建和销毁,即可以监听服务器的启动和关闭*
    1. contextInitialized方法在ServletContext域对象创建时执行
    2. contextDestroyed方法在ServletContext域对象销毁时执行
  2. ServletContextAttributeListener监听器可以监听:
    1. attributeAdded方法在属性添加到ServletContext中时执行
    2. attributeRemoved方法在属性从ServletContext中移除时执行
    3. attributeReplaced方法在属性从ServletContext中被替换时执行
  3. HttpSessionListener监听器可以监听HttpSession域对象的创建和销毁
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Filter和Listener 1. Filter 概念:Filter(过滤器),当访问服务器资源时,过滤器可以将...
    青丶空阅读 195评论 2 0
  • Filter:过滤器 Listener:监听器 Filter(重点) 概念:生活中的过滤器:净水器,空气净化器,土...
    abboo阅读 216评论 0 0
  • Listener 监听器,监听某一个事件的发生。其实就是接口回调,被监听的方法接收一个接口作为参数,在被监听方法中...
    hgzzz阅读 295评论 0 0
  • 监听器(listener) 监听器简介 :监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个...
    奋斗的老王阅读 2,565评论 0 53
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,138评论 2 7