Spring Cloud Gateway配置CORS时corsConfigurationSource Bean创建失败
问题定位与解决办法
核心原因
Spring Cloud Gateway 是基于 Reactive WebFlux 构建的非Servlet栈框架,但你配置的corsConfigurationSource Bean用了Servlet环境下的实现类,导致找不到javax.servlet.ServletRequest类,触发NoClassDefFoundError。
修正步骤
1. 替换为Reactive环境的CORS配置类
放弃Servlet版的org.springframework.web.cors.UrlBasedCorsConfigurationSource,改用Reactive专属的org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource,并通过CorsWebFilter来注册配置。
2. 修改SecurityConfig代码
将原来的corsConfigurationSource Bean替换为CorsWebFilter Bean,示例代码如下:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.springframework.web.cors.reactive.CorsWebFilter; @Configuration public class SecurityConfig { // 其他Security配置(如OAuth2、Keycloak相关) @Bean public CorsWebFilter corsWebFilter() { CorsConfiguration corsConfig = new CorsConfiguration(); // 根据你的需求调整CORS规则 corsConfig.addAllowedOriginPattern("*"); // 推荐用originPattern替代直接的origin,更安全 corsConfig.addAllowedMethod("*"); corsConfig.addAllowedHeader("*"); corsConfig.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); return new CorsWebFilter(source); } }
3. 清理冲突依赖
检查pom.xml,确保没有引入spring-boot-starter-web(Servlet栈依赖),因为它和Gateway依赖的spring-boot-starter-webflux会产生冲突,必须移除。
补充说明
在Spring Cloud Gateway中,CorsWebFilter会自动融入网关的请求处理链,无需在SecurityWebFilterChain中额外配置CORS相关规则。
内容的提问来源于stack exchange,提问作者alexmntmnk
相关产品推荐
相关产品推荐

