在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. 详细执行流程
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:处理与业务相关的逻辑(如权限校验、参数预处理)。
 
通过理解两者的优先级和执行顺序,可以更灵活地设计请求处理逻辑。