在Spring MVC中,Filter和HandlerInterceptor的执行顺序及优先级如下:
1. 执行顺序与优先级
-
Filter (Servlet规范)的优先级高于 HandlerInterceptor(Spring MVC框架)。
-
请求处理流程:
- Filter链 :所有配置的Filter按顺序处理请求(在请求进入
DispatcherServlet
之前)。 - DispatcherServlet:请求到达Spring MVC核心控制器。
- HandlerInterceptor :通过
preHandle
方法介入请求(在Controller方法调用前)。
- Filter链 :所有配置的Filter按顺序处理请求(在请求进入
-
响应处理流程:
- HandlerInterceptor 的
postHandle
(Controller执行后,视图渲染前)和afterCompletion
(请求完全结束后)。 - Filter链:按逆序处理响应(从最后一个Filter回到第一个)。
- HandlerInterceptor 的
2. 详细执行流程
text
HTTP请求
→ Filter1 → Filter2 → ... → FilterN
→ DispatcherServlet
→ HandlerInterceptor1.preHandle()
→ HandlerInterceptor2.preHandle()
→ Controller方法
→ HandlerInterceptor2.postHandle()
→ HandlerInterceptor1.postHandle()
→ 视图渲染(如存在)
→ HandlerInterceptor2.afterCompletion()
→ HandlerInterceptor1.afterCompletion()
← FilterN处理响应(逆序) ← ... ← Filter1处理响应
3. 配置顺序的影响
- Filter顺序 :
- 在
web.xml
中按配置顺序执行(或通过FilterRegistrationBean
的order
属性)。
- 在
- HandlerInterceptor顺序 :
- 通过
InterceptorRegistry
添加的顺序决定:preHandle
:按注册顺序执行。postHandle
和afterCompletion
:按注册逆序执行。
- 通过
4. 关键区别
特性 | Filter | HandlerInterceptor |
---|---|---|
规范/框架 | Servlet规范 | Spring MVC框架 |
作用范围 | 所有请求(包括静态资源) | Spring管理的Controller请求 |
访问Spring上下文 | 无法直接访问 | 可以直接访问Spring Bean |
控制粒度 | 更底层(请求/响应预处理) | 更贴近业务逻辑(如Controller前后处理) |
5. 使用场景
- Filter:处理与业务无关的通用逻辑(如编码设置、日志记录、跨域处理)。
- HandlerInterceptor:处理与业务相关的逻辑(如权限校验、参数预处理)。
通过理解两者的优先级和执行顺序,可以更灵活地设计请求处理逻辑。