一、Filter、Interceptor、Listener简介
1. Filter:即过滤器。它是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
2. Interceptor:拦截器是动态拦截Action所调用的对象;它提供了一种可以使开发者在一个Action执行前后执行一段代码的机制,可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。
注:在AOP中,拦截器用于在某个方法或者字段被访问之前进行拦截,然后在之前或之后加入某些操作。
3. Listener:监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。
注:常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等。
二、Filter、Interceptor、Listener的作用
1. Filter:用于设置字符编码、URL级别的权限控制、敏感词汇过滤;
2. Interceptor:拦截未登录的用户;其功能与过滤器相似;
3. Listener:主要用于监听对应事件的发生;主要有:ServletContext、HttpSession、ServletRequest对象的创建和销毁、属性的增加或删除,HttpSession中对象的绑定和解绑;
三、Filter、Interceptor、Listener的执行顺序
1. Filter:过滤器依赖web容器而存在,在web.xml中配置,会在请求进入Servlet之前或出Servlet之后调用;
2. Interceptor:拦截器依赖web框架(Spring、Struts),在web框架的配置文件中配置,在请求进入Servlet之后且进入对应的Controller之前,或出Controller之后且出Servlet之前调用;
3. Listener:依赖web容器存在,在web.xml中配置,在时间触发时调用;
所以,从执行顺序上来看:
chain.doFilter()之前的代码 --> interceptor.preHandle() --> service() --> interceptor.postHandler() --> interceptor.afterCompletion() --> chain.doFilter()之后的代码
四、Filter和Interceptor的区别
过滤器、拦截器、监听器被称之为Javaweb中的三大器,除监听器是有针对性的作用之外,前两者在功能上是具有一定的相似性的,在此对二者的功能作以区别:
1. 实现方式:拦截器是基于Java反射机制来实现的;而过滤器是基于回调函数实现的;
2. 容器依赖性:拦截器不依赖Servlet容器;而过滤器依赖于Servlet容器;
3. 作用点:拦截器只对Action起作用;而过滤器可以对所有的请求起作用;
4. 对象访问权限:拦截器可以访问Action上下文和值栈中的典型;而过滤器不能;
5. 调用次数:在Action的生命周期中,拦截器可以多次调用;而过滤器只能在容器初始化时调用一次;
五、Filter、Interceptor、Listener配置及实现方式
这里仅收集一些理论上的东西,关于三大器的配置及其实现方式可参考如下链接文档:
1. Filter:https://blog.youkuaiyun.com/reggergdsg/article/details/52821502
2. Interceptor:https://blog.youkuaiyun.com/reggergdsg/article/details/52962774
3. Listener:https://blog.youkuaiyun.com/reggergdsg/article/details/52891311