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

Spring Security 6中OncePerRequestFilter未执行问题求助

问题排查与修复建议

你遇到的JwtFilter未执行问题,核心原因和修复方案如下:

1. 致命拼写错误(直接导致过滤器未加载)

在AppConfiguration的securityFilterChain方法中,存在两处明显拼写错误:

// 错误1:httBasic 少了一个字母p
http.httBasic(Customizer.withDefaults());
// 正确写法:
http.httpBasic(Customizer.withDefaults());

// 错误2:configuratonSource 少了一个字母i
http.cors(configurer -> configurer.configuratonSource(corsConfig()));
// 正确写法:
http.cors(configurer -> configurer.configurationSource(corsConfig()));

第一个错误会导致Spring Security无法初始化BasicAuthenticationFilter,而你调用addFilterAt(new JwtFilter(), BasicAuthenticationFilter.class)时,指定的目标过滤器不存在,最终JwtFilter无法被加入过滤链;第二个错误会导致CORS配置失效,需一并修复。

2. 过滤器实例化优化(更规范的写法)

你的JwtFilter已经添加@Component注解,属于Spring管理的Bean,建议直接注入而非手动new实例,避免重复创建对象:

@Configuration
@EnableWebSecurity
public class AppConfiguration {

    private final JwtFilter jwtFilter;

    // 构造注入Spring管理的JwtFilter实例
    public AppConfiguration(JwtFilter jwtFilter) {
        this.jwtFilter = jwtFilter;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        System.out.println("Inside filterChain.");

        http.cors(configurer -> configurer.configurationSource(corsConfig()));
        http.csrf(AbstractHttpConfigurer::disable);
        http.authorizeHttpRequests((requests) -> requests
            .requestMatcher("/actuator/health").permitAll()
            .anyRequest().authenticated());
        http.httpBasic(Customizer.withDefaults());
        http.addFilterAt(jwtFilter, BasicAuthenticationFilter.class);
        return http.build();
    }

    // 确保corsConfig()方法已正确实现
    private CorsConfigurationSource corsConfig() {
        CorsConfiguration configuration = new CorsConfiguration();
        // 补充你的CORS规则配置,例如允许的源、请求方法等
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

3. 额外排查点

  • 请求路径验证:确保测试的请求不是/actuator/health(该路径被设置为permitAll,虽然OncePerRequestFilter默认处理所有请求,但建议测试需要认证的接口来验证过滤器执行情况)。
  • 日志级别调试:将Spring Security日志级别调整为DEBUG,查看过滤链初始化日志,确认JwtFilter是否被加入链中:
    logging.level.org.springframework.security=DEBUG
    
  • 过滤器顺序调整:若修复后仍未执行,可尝试使用addFilterBefore或addFilterAfter指定明确顺序,例如:
    http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:35:13