SpringCloud Gateway解决CROS跨域问题

目录

一、问题

二、原因

二、解决方法

1、gateway设置允许跨域

2、手动写一个 CorsResponseHeaderFilter 的 GlobalFilter 去修改Response中的头


一、问题

前端代码访问后端代码时候会出现
 

Access to XMLHttpRequest at 'http://localhost:8080/user/logout' from origin 'http://localhost:8800' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed.

这种报错,前端会显示不允许有多个’Access-Control-Allow-Origin’ CORS头

二、原因

仔细查看返回的响应头,里面包含了两份Access-Control-Allow-Origin头。

二、解决方法

1、gateway设置允许跨域

使用yml格式去设置允许跨域

    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedHeaders: "*"
            allowedMethods: "*"
      default-filters:
        - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST

2、手动写一个 CorsResponseHeaderFilter 的 GlobalFilter 去修改Response中的头

@Component
public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {

    private static final Logger logger = LoggerFactory.getLogger(CorsResponseHeaderFilter.class);

    private static final String ANY = "*";

    @Override
    public int getOrder() {
        // 指定此过滤器位于NettyWriteResponseFilter之后
        // 即待处理完响应体后接着处理响应头
        return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
    }

    @Override
    @SuppressWarnings("serial")
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            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)
                            || kv.getKey().equals(HttpHeaders.VARY)))
                    .forEach(kv ->
                    {
                        // Vary只需要去重即可
                        if(kv.getKey().equals(HttpHeaders.VARY))
                            kv.setValue(kv.getValue().stream().distinct().collect(Collectors.toList()));
                        else{
                            List<String> value = new ArrayList<>();
                            if(kv.getValue().contains(ANY)){  //如果包含*,则取*
                                value.add(ANY);
                                kv.setValue(value);
                            }else{
                                value.add(kv.getValue().get(0)); // 否则默认取第一个
                                kv.setValue(value);
                            }
                        }
                    });
        }));
    }
}

引用:地址 

相关推荐

  1. SpringCloud Gateway解决CROS问题

    2024-01-19 03:04:02       58 阅读
  2. 通过服务器配置cros解决问题

    2024-01-19 03:04:02       42 阅读
  3. 问题CORS

    2024-01-19 03:04:02       35 阅读
  4. ASP.NET的WebServiceCORS问题解决方案

    2024-01-19 03:04:02       26 阅读
  5. ASP.NET的WebServiceCORS问题解决方案

    2024-01-19 03:04:02       34 阅读
  6. 资源共享(CORS问题解决方案

    2024-01-19 03:04:02       28 阅读
  7. 【Django】CORS问题

    2024-01-19 03:04:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-19 03:04:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-19 03:04:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-19 03:04:02       82 阅读
  4. Python语言-面向对象

    2024-01-19 03:04:02       91 阅读

热门阅读

  1. Unity3D PVP游戏位置同步算法优化详解

    2024-01-19 03:04:02       55 阅读
  2. 2401vim,vim实现任务列表

    2024-01-19 03:04:02       58 阅读
  3. VSCode Live Server插件 找不到Chorme解决方法

    2024-01-19 03:04:02       60 阅读
  4. linux 设备驱动之tty 线路设置

    2024-01-19 03:04:02       45 阅读
  5. pom.xml中resouces标签

    2024-01-19 03:04:02       62 阅读
  6. 167. 两数之和2 - 输入有序数组

    2024-01-19 03:04:02       53 阅读
  7. 深度学习与药物发现在健康衰老中的应用

    2024-01-19 03:04:02       51 阅读
  8. DPDK trace 的简单使用

    2024-01-19 03:04:02       52 阅读
  9. 正则表达式

    2024-01-19 03:04:02       54 阅读
  10. React导航守卫(V6路由)

    2024-01-19 03:04:02       60 阅读