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,因此:FilterRegistrationBeanorder < -100:在Spring Security所有过滤器之前执行FilterRegistrationBeanorder > -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
相关产品推荐
相关产品推荐

