【问题解决】Spring Cloud Gateway配置文件中跨域设置失效

Spring Cloud Gateway跨域问题及解决办法

 一,问题背景

基于Spring Cloud + gateway + nginx来搭建部署项目时,在gateway配置了跨域设置,如下:

但是会发现通过网关访问API时还是会有跨域问题。
这个时候聪明的你可能会想到在Nginx里也配置上跨域的设置, 如下:

但是还是一样的会有跨域问题。

然后又想起是不是业务代码里的Controller里也得加上CrossOrigin的配置,然后一通操作之后,还是有跨域问题,问题是响应头里有两个相同的*配置。


二,问题原因

1,  Gateway里的配置和Nginx里配置不能重复,重复之后就会出现Duplicate的问题
2,Controller里加的跨域配置和Nginx里配置不能重复
3,Gateway里的配置不生效


三,解决方案

1,在Gateway中添加配置

完整如下:

spring:
  main:
    web-application-type: reactive
  cloud:
    loadbalancer:
      cache:
        ttl: 10
    gateway:
      discovery:
        locator:
          #开启从注册中心动态创建路由的功能,利用微服务名进行路由
          enabled: true
          #开启小写验证,默认feign根据服务名查找都是用的全大写
          lowerCaseServiceId: true
      filter:
        remove-hop-by-hop:
          headers:
            # 以下是去掉网关默认的请求响应头
            - trailer
            - te
            - keep-alive
            - transfer-encoding
            - upgrade
            - proxy-authenticate
            - connection
            - proxy-authorization
            - x-application-context
            # 以下是去掉服务层面定义的跨域
            - access-control-allow-credentials
            - access-control-allow-headers
            - access-control-allow-methods
            - access-control-allow-origin
            - access-control-max-age
            - vary
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedHeaders: "*"
            allowedMethods: "*"
            maxAge: 3628800
2,使gateway的跨域配置生效

将 chain.filter(exchange); 替换成下面这个方法

private Mono<Void> getVoidMono(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange).then(Mono.defer(() -> {
            exchange.getResponse().getHeaders().entrySet().stream()
                .filter(kv -> kv.getValue() != null && kv.getValue().size() > 1)
                .filter(kv -> kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
                    || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS))
                .forEach(kv -> kv.setValue(Collections.singletonList(kv.getValue().get(0))));
            return chain.filter(exchange);
        }));
    }
3,去掉Nginx中的跨域配置
4,去掉业务Controller的跨域配置

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东皋长歌

你的鼓励是我分享的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值