我正在尝试使用spring-cloud和spring-gateway构建一个微服务spring-boot应用程序。在我的应用程序中,有一个api网关应用程序处理所有请求,稍后将这些请求发送到正确的微服务。
对于前端,我使用angular,对于测试端点,我使用poster。目前我有一个CORS问题。我以这种方式配置了api网关:
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping=true
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedOrigins=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedHeaders=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedMethods=*
根据文档,这应该足以让客户毫无问题地提出请求。
此外,我已经以这种方式配置了所有网关路由。。。
spring.cloud.gateway.routes[8].id=entity-service
spring.cloud.gateway.routes[8].uri=lb://entity-service
spring.cloud.gateway.routes[8].predicates[0]=Path=/api/entity/hello
我的安全配置也是下面的配置
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity serverHttpSecurity) {
serverHttpSecurity
.authorizeExchange(exchange ->
exchange.pathMatchers("/eureka/**")
.permitAll()
.anyExchange()
.authenticated())
.cors()
.and()
.csrf()
.disable()
.oauth2ResourceServer(ServerHttpSecurity.OAuth2ResourceServerSpec::jwt);
return serverHttpSecurity.build();
}
}
也就是说,例如,如果我向路径/api/entity/hello
的邮递员提出请求,我会得到正确的响应。如果我正在使用angular客户端并尝试访问端点,首先会发出OPTIONS飞行前请求并返回:
阻止跨来源请求:同源策略不允许读取位于的远程资源http://localhost:8080/api/entity/hello.(原因:缺少CORS标头"Access Control Allow Origin"(。状态代码:401。
则对CCD_ 2路径进行GET请求并且结果是相同的。
我使用的是springboot 2.7.3和最新的springboot云和网关包。
你知道怎么解决这个问题吗?任何帮助都将不胜感激。感谢所有
尝试将CorsConfigurationSourcebean添加到您的配置类中。
@Bean
public CorsConfigurationSource corsConfigurationSource(GlobalCorsProperties globalCorsProperties) {
var source = new UrlBasedCorsConfigurationSource();
globalCorsProperties.getCorsConfigurations().forEach(source::registerCorsConfiguration);
return source;
}