Spring WebFlux应用配置跨域后未返回响应头如何解决
WebFlux跨域配置不生效解决方案
问题根因
你同时配置了WebFluxConfigurer.addCorsMappings全局跨域规则、CorsWebFilter跨域过滤器,以及控制器@CrossOrigin注解,三类配置存在优先级冲突,且你声明的CorsConfiguration仅配置了允许源,缺少必填的请求方法、请求头配置,导致跨域逻辑未正常触发响应头返回。
WebFlux 跨域配置优先级为:CorsWebFilter > 控制器@CrossOrigin注解 > WebFluxConfigurer.addCorsMappings,重复配置容易出现规则覆盖问题。
具体解决步骤
- 第一步:删除冗余配置,二选一保留全局跨域规则即可,更推荐使用
CorsWebFilter,适配所有WebFlux端点(包括函数式接口、Actuator端点等场景),删除WebFluxConfigurer的addCorsMappings实现代码。 - 第二步:补全
CorsConfiguration必填配置项,参考代码如下:
@Configuration public class CorsConfig { @Bean public CorsWebFilter corsWebFilter() { CorsConfiguration corsConfig = new CorsConfiguration(); // 允许的来源,生产环境建议替换为实际业务域名,不要用* corsConfig.setAllowedOrigins(List.of("*")); // 允许所有常用请求方法 corsConfig.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS")); // 允许所有请求头 corsConfig.setAllowedHeaders(List.of("*")); // 预检请求缓存时长,单位为秒,减少重复预检请求 corsConfig.setMaxAge(3600L); // 若接口需要传递Cookie等凭证,开启下面配置,注意此时allowedOrigins不能用通配符*,必须指定具体域名 // corsConfig.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); return new CorsWebFilter(source); } }
- 第三步:如果项目集成了Spring Security,需要额外在安全配置中开启CORS支持,避免跨域请求被安全过滤器拦截:
@Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { // 开启CORS支持,会自动使用你声明的CorsWebFilter配置 http.cors(Customizer.withDefaults()); // 其余安全规则配置 return http.build(); }
- 第四步:如果仅需要部分控制器开启跨域,删除所有全局跨域配置,仅保留对应控制器上的
@CrossOrigin注解即可。
配置完成后发送OPTIONS预检请求到对应接口,校验响应头是否正常返回Access-Control-Allow-Origin等跨域字段即可。
内容的提问来源于stack exchange,提问作者Tobiq
相关产品推荐
相关产品推荐

