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

如何确认Spring Boot3中@Order+@Component自定义过滤器在Security后执行?

问题:确认@Order+@Component自定义过滤器在Spring Security过滤器之后执行

我正在构建基于Spring Boot v3.1.1的应用,引入了Spring Security及OAuth2资源服务器依赖:

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
}

我创建了两个自定义过滤器,期望它们在Spring Security过滤器之后执行(处于过滤器链末尾):

@Order(1)
@Component
public class DeviceFilter extends OncePerRequestFilter {}

@Order(2)
@Component
public class MdcFilter extends OncePerRequestFilter {}

这两个过滤器能正常工作,但我无法确认它们的执行顺序是否符合预期。

我尝试开启Spring Security的debug模式:

@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .formLogin(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable) // Removes CsrfFilter
                .logout(AbstractHttpConfigurer::disable) // Removes LogoutFilter
                .rememberMe(AbstractHttpConfigurer::disable) // Removes RememberMeAuthenticationFilter
                .requestCache(RequestCacheConfigurer::disable) // Removes RequestCacheAwareFilter
                
                .cors(withDefaults()) // Adds CorsFilter

                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/public/**").permitAll()
                        .anyRequest().authenticated()
                )

                .sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .oauth2ResourceServer(oauth2 -> oauth2.jwt(withDefaults()));

        return http.build();
    }

}

控制台输出的Security过滤器链中并未显示我的两个自定义过滤器,但它们确实在运行:

Security filter chain: [
  DisableEncodeUrlFilter
  WebAsyncManagerIntegrationFilter
  SecurityContextHolderFilter
  HeaderWriterFilter
  CorsFilter
  BearerTokenAuthenticationFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  AuthorizationFilter
]

我猜测Spring Security过滤器与自定义过滤器相互独立,自定义过滤器不会被加入Security管理的过滤器数组,但对此并不确定。

我也曾在自定义过滤器中添加日志来检查顺序,日志显示两个过滤器的执行顺序正确:

09:05AM INFO DeviceFilter                     : {} DeviceFilter!!!!!!!
09:05AM INFO MdcFilter                        : {} MdcFilter!!!!!!!

但我仍无法确保它们是在Spring Security过滤器之后执行——因为我只希望它们在用户通过所有Security认证检查后才运行。

我还尝试过在securityFilterChain()方法中添加过滤器,这种方式下过滤器不再需要@Order和@Component注解:

@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // .......
                // ......
                

                .addFilterAfter(new DeviceFilter(), AuthorizationFilter.class);
                .addFilterAfter(new MdcFilter(), DeviceFilter.class);

        return http.build();
    }

}

此时控制台输出的过滤器链中能看到我的自定义过滤器:

Security filter chain: [
  DisableEncodeUrlFilter
  WebAsyncManagerIntegrationFilter
  SecurityContextHolderFilter
  HeaderWriterFilter
  CorsFilter
  BearerTokenAuthenticationFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  AuthorizationFilter
  DeviceFilter // <=================
  MdcFilter // <=================
]

我更倾向于使用@Order+@Component的方式,因为这种方式对我来说更简便。

我查阅过相关讨论,但仍有疑问:如何确认使用@Order和@Component的自定义过滤器确实在Spring Security过滤器之后执行?

感谢您的帮助,任何相关建议都将不胜感激。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:42:23