Spring Boot配置全局跨域后部分请求仍被CORS拦截如何解决
Spring Boot 跨域配置后部分请求仍被拦截的排查解决思路
- 优先检查是否放行OPTIONS预检请求
浏览器对非简单请求(比如Content-Type为application/json的POST/PUT请求、携带自定义请求头的请求),会在正式请求前先发送OPTIONS方法的预检请求,当前配置仅放行GET/POST/PUT/DELETE四类方法,预检请求会被直接拦截,导致后续正式请求触发CORS错误。
修复方式:在允许的请求方法列表中补充OPTIONS,开发环境也可直接通配所有方法:configuration.setAllowedMethods(Arrays.asList("GET","POST", "PUT", "DELETE", "OPTIONS")); - 补充请求头、凭证相关的CORS配置
默认CORS配置不会放行自定义请求头(比如前端携带的Authorization鉴权头、X-Requested-With等),也不允许请求携带Cookie等凭证信息,如果前端请求开启了withCredentials: true或者携带了自定义头,会被拦截。补充以下配置即可:// 允许所有请求头,生产环境可按需枚举允许的头 configuration.addAllowedHeader("*"); // 允许前端携带凭证,注意开启该配置后不能将allowedOrigins设为*,当前配置已写死具体源不受影响 configuration.setAllowCredentials(true); // 可选:允许前端读取所有自定义响应头 configuration.addExposedHeader("*"); - 排查CORS配置与Spring Security的优先级冲突
如果项目引入了Spring Security,默认的CORS过滤器优先级低于Security的鉴权拦截链,请求会在到达CORS逻辑前就被Security拦截,导致CORS规则不生效。修复方式为在Security配置中显式开启CORS支持,框架会自动注入你定义的CorsConfigurationSource:
如果没有使用Spring Security,也可以手动将CorsFilter注册为最高优先级过滤器,保证CORS逻辑最先执行:@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .cors(Customizer.withDefaults()) // 其余原有Security配置,比如鉴权规则、放行路径等 .authorizeHttpRequests(auth -> auth .requestMatchers("/user/login").permitAll() .anyRequest().authenticated() ); return http.build(); }@Bean public FilterRegistrationBean<CorsFilter> corsFilter(CorsConfigurationSource corsConfigurationSource) { FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(corsConfigurationSource)); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; } - 清理冗余的路径配置
当前配置中既通过/**匹配了所有接口路径,又单独注册了/user/login的CORS规则,属于冗余配置,后续如果修改单路径规则容易出现配置覆盖问题,直接删除source.registerCorsConfiguration("/user/login", configuration);这行即可。 - 校验源地址的匹配准确性
打开浏览器开发者工具,定位到触发CORS错误的请求,查看请求头中的Origin字段值,确认其与配置中允许的源完全一致:注意检查是否存在尾部斜杠(比如http://localhost:3000/)、http/https协议写错、端口号不匹配的问题,如果存在差异将对应源补充到允许列表即可。
内容的提问来源于stack exchange,提问作者NoelHug
相关产品推荐
相关产品推荐

