首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有弹簧云网关的双CORS报头

带有弹簧云网关的双CORS报头
EN

Stack Overflow用户
提问于 2022-11-15 03:18:13
回答 1查看 83关注 0票数 0

如何禁用网关上的CORS?我的意思是真正的禁用,在stackoeverflow或其他地方搜索“禁用网关CORS”时,不允许来自所有来源的所有方法的请求。

我在一些服务前面有一个spring云网关,这些服务已经定位了响应CORS头(Access-Control-Allow-Origin和类似的),对于其中的一些服务,我很难禁用CORS (例如Keycloak)。

我的问题是spring云网关也设置了一些头,这会导致重复的CORS头和客户端应用程序中的CORS错误。因此,我希望完全禁用网关上的CORS过滤器(理想情况下是全局的,但是应用于每个路由的filter配置也是可以接受的)

网关配置:

代码语言:javascript
复制
<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>
代码语言:javascript
复制
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=*
代码语言:javascript
复制
@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报头不再加倍,通过网关的请求是成功的(但是直接请求失败)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-17 23:45:16

我找到了一种在网关上取消重复CORS头的方法:

代码语言:javascript
复制
    @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头,但至少这是可用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74440262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档