16. 过滤器监听器核心知识点汇总

给初学者的建议

  • 过滤器Filter及监听器Listener在JavaWeb开发中很少直接使用,但经常使用在java框架中仿照两者的设计思想而创造出来的其他技术,比如Struts2中的拦截器,另外在其他框架中也用到了两者并且充当十分重要的角色,比如在Struts2框架中采用过滤器作为核心来加载配置文件,拦截请求资源等等。在Spring中利用监听器来加载Spring核心配置文件。因此初学者还是很有必要对这两个技术核心内容熟悉并掌握的。

监听器 Listener

概念

所谓的监听器是指对整个WEB环境的监听,当被监视的对象发生改变时,立即调用相应的方法进行处理。

作用

每个监听器的具体作用不再一一列举,此处只对监听接口做一个列举汇总,若对于某个监听器有疑惑或者感兴趣,自己可以写个例子做下测试。

  • 监听域对象创建与销毁

    • ServletContextListener

    • HttpSessionListener

    • ServletRequestListener

    • 需要在web.xml中配置对应标签

  • 监听域对象属性变更(添加,替换,删除)

    • ServletContextAttributeListener

    • HttpSessionAttributeListener

    • ServletRequestAttributeListener

    • 需要在web.xml中配置对应标签

  • 实现指定接口JavaBean,从session作用域存放或异常监听

    • HttpSessionBindingListener

    • 该监听器需配置到对应的JavaBean上

  • 监听特殊JavaBean在session作用域的活化与钝化

    • HttpSessionActivationListener

    • 该监听器需配置到对应的JavaBean上

过滤器Filter

过滤器的配置

  • 定义一个实现Filter接口的实现类

  • 实现对应的init(),doFilter(),destory() 方法

  • 在web.xml中配置<filter> 标签及对应的<filter-mapping> 标签

Filter生命周期

过滤器从创建到销毁的过程

  • 服务器启动的时候,服务器就会创建过滤器的对象,每次访问被拦截目标资源,过滤器中的doFilter的方法就会执行。当服务器关闭的时候,服务器就会销毁Filter对象。

  • 服务器在启动时执行初始化方法,init。

  • 访问资源被拦截时执行拦截方法,doFiter。放行:chain.doFilter(request,response)

  • 服务器关闭时执行销毁方法,destory

注意:FilterChain过滤器链中的过滤器的执行的顺序跟\的配置顺序有关,顺序在前先执行,顺序在后,后执行

  • 过滤器的配置

    • url-pattern的配置与servlet中的配置一样:

      • 完全路径匹配:以/开始 /aaa ,/aaa/bbb

      • 目录匹配:以/ 开始,/* ,/aaa/*

      • 扩展名匹配:不能以/ 开始,*.do,*.jsp,*.action

有关Filter中对doFilter方法的理解

public class DemoFilter implements javax.servlet.Filter {
    public void destroy() {
    }
    public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) req;
        System.out.println(httpServletRequest.getRequestURI()+"走进来了~~~~");
        chain.doFilter(req, resp);
        //程序代码...
    }
    public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {

    }
}
  • 思考:上述代码中,若是在该Filter中在执行chain.doFilter(req,resp) 之后再加一下程序代码,那么这些程序代码的执行时机是什么时候呢?

    • 可以这么理解:该web应用中所有的过滤器会形成一条按照在web.xml中配置\的前后顺序组成的链,每执行到一个chain.doFilter(req,resp) 的时候就会去执行下一个过滤器程序,当下一个过滤程序执行完毕后会返回到本程序接着走下面的程序代码 ,所以说过滤器链是一个有去有回的过程。

Last updated

Was this helpful?