在 Spring 应用中,OncePerRequestFilter(属于过滤器链)的执行顺序会早于 Spring MVC 的拦截器(HandlerInterceptor) 。以下是详细分析:
1. 请求处理流程
Java Web 应用的请求处理流程通常分为两个阶段:
-
过滤器链阶段(Servlet Filter Chain) :
- 请求首先经过 Servlet 容器配置的过滤器链。
OncePerRequestFilter作为 Spring Security 的一部分,是过滤器链中的一个节点。
-
Spring MVC 阶段:
- 请求到达
DispatcherServlet后,进入 Spring MVC 的处理流程。 - 拦截器(
HandlerInterceptor) 在这一阶段生效(如preHandle方法)。
- 请求到达
2. 执行顺序对比
| 组件类型 | 触发阶段 | 执行顺序 |
|---|---|---|
OncePerRequestFilter | Servlet 过滤器链阶段 | 先于拦截器 |
HandlerInterceptor | Spring MVC 阶段 | 后于过滤器链 |
3. 结论
- 过滤器(Filter) 是 Servlet 规范定义的组件,优先级高于 Spring MVC 的拦截器。
OncePerRequestFilter作为 Spring Security 过滤器链的一部分,会在请求到达DispatcherServlet之前执行。- 拦截器(
HandlerInterceptor) 是 Spring MVC 的组件,仅在请求进入DispatcherServlet后触发。
4. 适用场景
| 组件 | 适用场景 |
|---|---|
OncePerRequestFilter | 安全认证、全局请求日志、跨域处理(CORS)等需在 Spring MVC 之前完成的逻辑。 |
HandlerInterceptor | 业务层拦截(如参数校验、接口耗时统计)、Controller 前后的特定逻辑。 |
总结
OncePerRequestFilter在 过滤器链阶段 生效,属于 Servlet 层级的处理。- 拦截器 在 Spring MVC 阶段 生效,属于框架层级的处理。
- 若需在 Spring Security 之后、Controller 之前插入逻辑,应选择拦截器;若需全局预处理(如安全),应使用过滤器。