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

本贴最后更新于 939 天前,其中的信息可能已经渤澥桑田

给初学者的建议

  • 过滤器 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 过滤器链中的过滤器的执行的顺序跟 <filter-mapping> 的配置顺序有关,顺序在前先执行,顺序在后,后执行

  • 过滤器的配置
    • 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 中配置 <filter-mapping> 的前后顺序组成的链,每执行到一个 chain.doFilter(req,resp)** 的时候就会去执行下一个过滤器程序,当下一个过滤程序执行完毕后会返回到本程序接着走下面的**程序代码** ,所以说过滤器链是一个有去有回的过程。**
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...