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

Spring Boot配置CORS遇跨域问题:带凭证请求失败

解决Spring Boot + Spring Security下CORS带Credentials的请求问题

你的问题核心是:前端请求携带withCredentials: true,但后端未返回Access-Control-Allow-Credentials: true响应头,同时Spring Security的CORS配置需要和凭证支持规则匹配。

解决方案1:修改控制器的@CrossOrigin注解

直接在控制器的@CrossOrigin注解中添加凭证允许配置,明确指定来源并开启凭证支持:

@RestController
@CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true")
@AllArgsConstructor
public class AuthController {
    // ... 原有代码不变
}

解决方案2:全局Spring Security CORS配置(推荐)

单独在控制器加注解不够统一,更推荐通过Spring Security全局配置CORS规则,确保Security过滤器优先处理CORS逻辑:

修改SecurityConfig.java,添加CorsConfigurationSource Bean,并在filterChain中指定使用该配置:

@Configuration
public class SecurityConfig {
    @Autowired
    private JwtAuthFilter authFilter;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable)
                // 指定使用自定义的CORS配置
                .cors(cors -> cors.configurationSource(corsConfigurationSource()))
                .authorizeHttpRequests(req -> req
                        .requestMatchers("/register").permitAll()
                        .requestMatchers("/login").permitAll()
                        .anyRequest().authenticated()
                )
                .addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class)
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authenticationProvider(authenticationProvider());
        return http.build();
    }

    // 自定义CORS配置源
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        // 允许的前端来源
        configuration.setAllowedOrigins(Collections.singletonList("http://localhost:3000"));
        // 允许的请求方法
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        // 允许的请求头
        configuration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type"));
        // 开启凭证支持
        configuration.setAllowCredentials(true);
        // 暴露响应头(如果前端需要读取自定义头的话)
        configuration.setExposedHeaders(Collections.singletonList("Authorization"));

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对所有路径应用该配置
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

    // ... 原有Bean配置不变
}

同时可以移除控制器上的@CrossOrigin注解,避免配置冲突。

关键说明

  • 当请求携带credentials时,Access-Control-Allow-Origin不能设为*,必须明确指定具体的前端域名(如http://localhost:3000)。
  • Spring Security的CORS过滤器会优先于控制器的@CrossOrigin生效,全局配置更可靠,尤其在使用JWT、Session等需要凭证的场景下。
  • 配置完成后,后端响应会自动包含Access-Control-Allow-Credentials: true和正确的Access-Control-Allow-Origin头,解决Firefox的报错问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:06:20