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实现类的过滤路径

      
      
          
          FilterImpl
          
          com.liu2m.filter.FilterImpl
      
      
      
          
          FilterImpl
          
          /
      
      
    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标签里绑定:

      
          
          com.liu2m.listener.SclImpl
      
      
    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域对象的创建和销毁

你可能感兴趣的:(Java EE-06-Filter和Listener)