SpringCloud Gateway解决CROS跨域问题

news/2025/3/29 14:57:31/

目录

一、问题

二、原因

二、解决方法

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 = "*";@Overridepublic 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);}}});}));}
}

引用:地址 


http://www.ppmy.cn/news/1328766.html

相关文章

Qt Linux安装qt5.9全过程

1 准备好安装包 qt安装包下载官网:https://download.qt.io/archive/qt 2 将安装包放到Linux环境下 我这里使用WinSCP将windows下的文件传输到Linux 3 ./qt-opensource-linux-x64-5.9.0.run 3-0 运行时目录的所有权错误wrong ownership on runtime directory 解决:切换roo…

如何用AirServer进行手机投屏?,Airserver 永久激活注册码

AirServer一款投屏神器&#xff0c;可以帮你轻松地将iPhone、iPad投屏到Mac。是不是经常看到游戏主播用AirServer投屏&#xff1f;此外&#xff0c;AirServer也是视频Up主必备工具之一&#xff01;用来录制演示教程不错。除了实现单个手机投屏到电脑或荧幕。如果你有多画面投屏…

SpikingJelly笔记之IFLIF神经元

文章目录 前言一、脉冲神经元二、IF神经元1、神经元模型2、神经元仿真 三、LIF神经元1、神经元模型2、神经元仿真 总结 前言 记录整合发放(integrate-and-fire, IF)神经元与漏电整合发放(leaky integrate-and-fire, LIF)神经元模型&#xff0c;以及在SpikingJelly中的实现方法…

前端开发领域的细分领域与特点

前端开发领域是一个广泛而多样的领域&#xff0c;包括了许多具体的细分领域。本文将介绍前端领域的细分领域&#xff0c;包括Web前端、移动端、桌面端、游戏端和VR/AR前端等&#xff0c;并分析它们各自的特点&#xff0c;以帮助读者更好地了解前端开发的多样性。 一、引言 前…

python 飞书 机器人

![在这里插入图片描述](https://img-blog.csdnimg.cn/e4758957286342999266a4ed01e19d59.png 废话 不多说 直接上 代码&#xff01;&#xff01;&#xff01; """coding:utf-8Software:PyCharmTime:2022/9/24 10:15Author:StartaoDescription: ""&q…

【数据结构】Splay树(伸展树)

前置知识 二叉树 就是一个长这样的树&#xff0c;树中每个结点都有一个父结点&#xff08;除了根结点没有父结点&#xff09;和最多两个子结点&#xff0c;每个结点的左儿子一定比它小&#xff0c;右儿子一定比它大。 这棵树的先序遍历很容易知道就是&#xff1a;1 2 3 4 5 …

PyTorch 中的距离函数深度解析:掌握向量间的距离和相似度计算

目录 Pytorch中Distance functions详解 pairwise_distance 用途 用法 参数 数学理论公式 示例代码 cosine_similarity 用途 用法 参数 数学理论 示例代码 输出结果 pdist 用途 用法 参数 数学理论 示例代码 总结 Pytorch中Distance functions详解 pair…

[SS]语义分割_转置卷积

转置卷积&#xff08;Transposed Convolution&#xff09; 抽丝剥茧&#xff0c;带你理解转置卷积&#xff08;反卷积&#xff09; 目录 一、概念 1、定义 2、运算步骤 二、常见参数 一、概念 1、定义 转置卷积&#xff08;Transposed Convolution&#xff09;&#xf…