Filter 和 Interceptor 详解
Filter 和 Interceptor 都是可以处理 HttpServletRequest、HttpServletResponse 的。Filter 是 JDK 自带的接口,而 Interceptor 是 Spring 封装的接口,可以理解成一种特殊的 Filter,下面会具体分析。

Filter

Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理生成响应,最后Filter再对服务器响应进行后处理。Filter 是可以复用的代码片段,常用来转换Http 请求响应头信息。Filter 不像 Servlet,它不能产生响应,而是只修改对某一资源的请求或者响应

Interceptor

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

两者的区别

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

两者在一个 Http 请求中的执行顺序

  • 对于自定义 Servlet 对请求分发流程:
    • Filter 过滤请求处理。
    • Servlet 处理请求。
    • Filter 过滤响应处理。
  • 对于自定义 Controller 的请求分发流程:
    • Filter 过滤请求处理。
    • Interceptor 拦截请求处理。
    • 对应的 HandlerAdapter 处理请求。
    • Interceptor 拦截响应处理。
    • Interceptor 的最终处理。
    • Filter 过滤响应处理。

示例

更多 web 开发相关示例请关注spring-demo