如何禁用网关上的CORS?我的意思是真正的禁用,在stackoeverflow或其他地方搜索“禁用网关CORS”时,不允许来自所有来源的所有方法的请求。
我在一些服务前面有一个spring云网关,这些服务已经定位了响应CORS头(Access-Control-Allow-Origin和类似的),对于其中的一些服务,我很难禁用CORS (例如Keycloak)。
我的问题是spring云网关也设置了一些头,这会导致重复的CORS头和客户端应用程序中的CORS错误。因此,我希望完全禁用网关上的CORS过滤器(理想情况下是全局的,但是应用于每个路由的filter配置也是可以接受的)
网关配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0-RC2</version>
<relativePath />
</parent>
<groupId>com.c4-soft.user-proxies</groupId>
<artifactId>gateway</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2022.0.0-RC1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping=true
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowed-origins=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowed-headers=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowed-methods=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].exposed-headers=*@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p.path("/users/**").uri("https://localhost:9443"))
.route(p -> p.path("/greet/**").uri("https://localhost:9445"))
.route(p -> p.path("/realms/**").uri("https://localhost:8443"))
.build();
}
}在资源服务器上启用CORS的情况下,尝试通过网关(将所有请求发送到端口8080)时,我会得到cors错误,响应标头包含双CORS头:

当配置为直接连接(联系资源-服务器在端口9443和9445),角请求是成功的。
如果我在资源服务器(端口9443和9445)中禁用CORS,那么CORS报头不再加倍,通过网关的请求是成功的(但是直接请求失败)。
发布于 2022-11-17 23:45:16
我找到了一种在网关上取消重复CORS头的方法:
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder, Function<GatewayFilterSpec, UriSpec> brutalCorsFilters) {
return builder.routes()
.route(p -> p.path("/users/**").filters(brutalCorsFilters).uri("https://localhost:9443"))
.route(p -> p.path("/greet/**").filters(brutalCorsFilters).uri("https://localhost:9445"))
.route(p -> p.path("/realms/**").filters(brutalCorsFilters).uri("https://localhost:8443"))
.build();
}
@Bean
Function<GatewayFilterSpec, UriSpec> brutalCorsFilters() {
return f -> f
.setResponseHeader("Access-Control-Allow-Origin", "*")
.setResponseHeader("Access-Control-Allow-Methods", "*")
.setResponseHeader("Access-Control-Expose-Headers", "*");
}这样,CORS配置可以在资源服务器上保持活动状态(但将被忽略)。
我倾向于禁用网关CORS处理器,并保留资源服务器CORS头,但至少这是可用的。
https://stackoverflow.com/questions/74440262
复制相似问题