Spring Security的OncePerRequestFilter和Spring组件中的拦截器哪个先生效?

269 阅读1分钟

在 Spring 应用中,OncePerRequestFilter(属于过滤器链)的执行顺序会早于 Spring MVC 的拦截器(HandlerInterceptor 。以下是详细分析:


1. 请求处理流程

Java Web 应用的请求处理流程通常分为两个阶段:

  1. 过滤器链阶段(Servlet Filter Chain)

    • 请求首先经过 Servlet 容器配置的过滤器链。
    • OncePerRequestFilter 作为 Spring Security 的一部分,是过滤器链中的一个节点。
  2. Spring MVC 阶段

    • 请求到达 DispatcherServlet 后,进入 Spring MVC 的处理流程。
    • 拦截器(HandlerInterceptor  在这一阶段生效(如 preHandle 方法)。

2. 执行顺序对比

组件类型触发阶段执行顺序
OncePerRequestFilterServlet 过滤器链阶段先于拦截器
HandlerInterceptorSpring 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 之前插入逻辑,应选择拦截器;若需全局预处理(如安全),应使用过滤器。