Java Web之filter、listener、Interceptor

**

1、Servlet

**
Servlet 是服务端的 Java 应用程序,用于处理HTTP请求,做出相应的响应。

Java Web之filter、listener、Interceptor

当客户端向服务器发出HTTP请求时,首先会由服务器中的 Web 容器(如Tomcat)对请求进行路由,交给该URL对应的 Servlet 进行处理,Servlet 所要做的事情就是返回适当的内容给用户。

在这里,我顺便谈谈自己对 JSP 和 Servlet 两者关系的理解。JSP 页面实际是被转换成了 Servlet 的形式运行,也就是说,我们可以将不同的 JSP 页面视为不同的 Servlet,理论上它们中的每一个都能够对客户端请求做出响应,只不过这些 Servlet 可能会将请求转发给其它 Servlet 进行处理,进而由其它 Servlet 做出响应。

要创建自己的 Servlet,可以通过以下三种方式来实现

  1. 实现 Servlet 接口
  2. 继承 GenericServlet 类
  3. 继承 HttpServlet 类

它们的 package 分别是:javax.servlet.Servlet、javax.servlet.GenericServlet、javax.servlet.http.HttpServlet。

**

2、Filter(过滤器)

**
Filter 是介于 Web 容器和 Servlet 之间的过滤器,用于过滤未到达 Servlet 的请求或者由 Servlet 生成但还未返回响应。

Java Web之filter、listener、Interceptor

客户端请求从 Web 容器到达 Servlet 之前,会先经过 Filter,由 Filter 对 request 的某些信息进行处理之后交给 Servlet。

同样,响应从 Servlet 传回 Web 容器之前,也会被 Filter 拦截,由 Filter 对 response 进行处理之后再交给 Web 容器。

若要创建自定义 Filter,需要实现 javax.servlet.Filter 接口。

**

3、Listener(监听器)

**

Listener 是用于监听某些特定动作的监听器。当特定动作发生时,监听该动作的监听器就会自动调用对应的方法。

Java Web之filter、listener、Interceptor

以 HttpSessionListener 为例:

Java Web之filter、listener、Interceptor

该 Listener 监听 session 的两种状态,即创建和销毁。当 session 被创建时,会自动调用 HttpSessionListener 的 sessionCreated() 方法,我们可以在该方法中添加一些处理逻辑。当 session 被销毁时,则会调用 sessionDestroyed() 方法。

下面是 Servlet 中的 8 个 Listener 接口,可分为三类:

第一类,ServletContext 相关接口

  1. ServletContextListener:用于监听 ServletContext 的启动和销毁。
  2. ServletContextAttributeListener:用于监听 application 范围的属性变化。

第二类,HttpSession 相关接口

  1. HttpSessionListener:用于监听 session 的创建和销毁。
  2. HttpSessionIdListener:用于监听 session 的 id 是否被更改。
  3. HttpSessionAttributeListener:用于监听 session 范围的属性变化。
  4. HttpSessionActivationListener:用于监听绑定在 HttpSession 对象中的 JavaBean 状态。
  5. HttpSessionBindingListener:用于监听对象与 session 的绑定和解绑。

第三类,ServletRequest 相关接口

  1. ServletRequestListener:用于坚挺 ServletRequest 对象的初始化和销毁。
  2. ServletRequestAttributeListener:用于监听 ServletRequest 对象的属性变化。

**

4、拦截器Interceptor(Spring MVC)

**

类似 面向切面编程 中的 切面 和 通知,我们通过 动态代理 对一个 service() 方法添加 通知 进行功能增强。比如说在方法执行前进行 初始化处理,在方法执行后进行 后置处理。拦截器 的思想和 AOP 类似,区别就是 拦截器 只能对 Controller 的 HTTP 请求进行拦截。

**

5、过滤器 VS 拦截器

**
5.1 两者的区别

  1. Filter 是基于 函数回调的,而 Interceptor 则是基于 Java 反射 和 动态代理。
  2. Filter 依赖于 Servlet 容器,而 Interceptor 不依赖于 Servlet 容器。
  3. Filter 对几乎 所有的请求 起作用,而 Interceptor 只对 Controller 对请求起作用。

5.2 执行顺序
对于自定义 Servlet 对请求分发流程:

  1. Filter 过滤请求处理;
  2. Servlet 处理请求;
  3. Filter 过滤响应处理。

对于自定义 Controller 的请求分发流程:

  1. Filter 过滤请求处理;
  2. Interceptor 拦截请求处理;
  3. 对应的 HandlerAdapter 处理请求;
  4. Interceptor 拦截响应处理(postHandle());
  5. Interceptor 的最终处理(afterCompletion());
  6. Filter 过滤响应处理。