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

@Order注解、FilterRegistrationBean.setOrder与Security过滤器配置的区别关联

Spring过滤器三种排序配置的区别与关联

三种配置适用场景完全独立,仅前两种存在优先级覆盖关系,和第三种无关联,具体区别如下:

  • @Order注解
    仅当你把过滤器直接加@Component注入容器,且没有用FilterRegistrationBean手动注册、也没有放到Spring Security过滤器链中时生效。排序作用于整个Servlet容器的全局过滤器链,数值越小优先级越高。
    代码示例:
    @Component
    @Order(1)
    public class SampleFilter extends OncePerRequestFilter {
       ...   
    }
    
  • FilterRegistrationBean配置类注册
    这是Spring官方推荐的手动注册过滤器到Servlet全局过滤器链的方式,这里通过setOrder()设置的优先级会直接覆盖过滤器类上的@Order注解,优先级比类上的注解更高。除此之外你还可以通过这个类配置过滤器的匹配路径、初始化参数、是否启用等属性,灵活度远高于直接加@Component。
    代码示例:
    @Configuration
    public class FilterConfig {
        @Bean
        public FilterRegistrationBean<SampleFilter> perfFilter() {
            FilterRegistrationBean<SampleFilter> registration = new FilterRegistrationBean<>();
            registration.setFilter(new SampleFilter());
            registration.setOrder(1);
            return registration;
        }
    }
    
  • WebSecurityConfigurerAdapter中配置
    通过Spring Security配置类添加的过滤器,不会进入Servlet全局过滤器链,而是被插入到Spring Security内部维护的专属过滤器链中,它的顺序只由你指定的相对位置(addFilterBefore/addFilterAfter/addFilterAt的参照过滤器)决定,和前两种配置的优先级参数完全无关。
    注意踩坑:如果你同时给一个过滤器加@Component又在Spring Security中注册,过滤器会被执行两次:一次在Servlet全局链、一次在Spring Security专属链。
    代码示例:
    public class SampleConfig extends WebSecurityConfigurerAdapter {
    
       @Autowired
       private SampleFilter sampleFilter;
    
       @Override
       public void configure(HttpSecurity http) throws Exception {
          ...
          http.addFilterBefore(this.sampleFilter, SampleFilterTwo.class);
       }
    
    }
    

关联总结

  1. 前两种配置都是作用于Servlet全局过滤器链,FilterRegistrationBean的order配置优先级高于过滤器类上的@Order注解
  2. 第三种是Spring Security内部过滤器链的专属配置,和前两种完全独立,互不影响
  3. 不要对同一个过滤器同时使用多种注册方式,避免重复执行逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:24:02