@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); } }
关联总结
- 前两种配置都是作用于Servlet全局过滤器链,
FilterRegistrationBean的order配置优先级高于过滤器类上的@Order注解 - 第三种是Spring Security内部过滤器链的专属配置,和前两种完全独立,互不影响
- 不要对同一个过滤器同时使用多种注册方式,避免重复执行逻辑
内容的提问来源于stack exchange,提问作者superigno
相关产品推荐
相关产品推荐

