You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security中FilterRegistrationBean在Servlet过滤器链的位置疑问

Spring Boot + Spring Security 中 FilterRegistrationBean 过滤器的位置解析

核心结论

FilterRegistrationBean<>定义的过滤器属于Servlet容器的原生过滤器链,和Spring Security的FilterChainProxy是同级关系,它们的执行顺序由order属性决定:

  • 若FilterRegistrationBean的order值小于DelegatingFilterProxy的默认order(-100),则会在Spring Security整个过滤器链之前执行
  • 若order值大于-100,则会在Spring Security过滤器链之后执行

详细拆解

Spring Security通过DelegatingFilterProxy接入Servlet容器的原生过滤器链,这个代理过滤器会将请求转发给FilterChainProxy——后者才是管理所有SecurityFilterChain中配置的过滤器(包括你用http.addFilterBefore(...)添加的自定义过滤器)的核心组件。

而你通过FilterRegistrationBean注册的过滤器,是直接注册到Servlet容器的过滤器链中的,和DelegatingFilterProxy处于同一层级。它们的执行优先级完全由各自的order值控制:

  • 可通过filterRegistrationBean.setOrder(int)设置顺序值,数值越小,执行优先级越高
  • Spring Security的DelegatingFilterProxy默认order为-100,因此:
    • FilterRegistrationBean order < -100:在Spring Security所有过滤器之前执行
    • FilterRegistrationBean order > -100:在Spring Security所有过滤器之后执行

验证方法

在自定义过滤器的doFilter方法中添加日志,直观观察执行顺序:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    log.info("执行FilterRegistrationBean过滤器: {}", this.getClass().getSimpleName());
    chain.doFilter(request, response);
}

同时给SecurityFilterChain中的自定义过滤器添加同类日志,启动应用后查看日志输出顺序即可验证。

编排建议

  • 若过滤器需要在Spring Security认证/授权前处理请求(如请求预处理、参数解密),设置order为小于-100的值(例如-200)
  • 若过滤器需要在Spring Security处理完成后执行(如响应包装、请求日志记录),设置order为大于-100的值(例如0)
  • 多个FilterRegistrationBean之间的顺序也通过各自的order值控制,数值越小越先执行

内容的提问来源于stack exchange,提问作者Dimitar Genov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:37:05