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
相关产品推荐
相关产品推荐

