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。
Last updated