记录一次Spring Cloud Gateway配置的跨域处理:解决 ‘Access-Control-Allow-Origin‘ 头包含多个值的问题

在微服务架构中,前端与后端分离已经成为一种常见模式。这种模式下,前后端通常会部署在不同的域名或端口上,这就导致了跨域资源共享(CORS)问题。最近,在我们的项目中,我们遇到了这样一个问题:“The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed” 

🛠️ 问题描述

当浏览器发起一个跨域请求时,它首先会发送一个预检请求(OPTIONS),以确定服务器是否允许该跨域请求。然而,在我们的案例中,出现了如下错误提示:❓

The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed

这意味着响应头Access-Control-Allow-Origin被设置了两次,这通常是由于在多个地方配置了CORS支持,例如在每个微服务和网关中分别进行了配置,从而导致冲突。❌

🔧 解决方案

为了解决上述问题,我们需要采取以下两个步骤:

第一步:删除注册到Nacos中的服务中配置的CorsConfig

为了避免重复设置CORS头信息,我们应该从各个微服务中移除任何现有的CORS配置。具体操作如下:

  • 找到并删除所有微服务中的CorsConfig类。
  • 确保这些服务不再自动添加CORS相关的HTTP响应头。

这样做可以确保只有网关负责处理跨域请求,避免了多次设置相同响应头的情况。✅

第二步:在Gateway中配置跨域

接下来,在Spring Cloud Gateway中进行统一的CORS配置。这里提供了一个简单的示例配置:

import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();// 设置允许跨域访问的源config.addAllowedOrigin("*");// 设置允许的方法config.addAllowedMethod("*");// 设置允许的头信息config.addAllowedHeader("*");// 允许凭证config.setAllowCredentials(true);UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

这段代码创建了一个全局的CORS过滤器,适用于所有的路由。通过这种方式,我们可以确保每次跨域请求都被正确地处理,而不会出现重复的Access-Control-Allow-Origin响应头。✅

路由规则配置解析

简要解析Spring Cloud Gateway的路由规则定义,以及其如何工作。

- id: admin_routeuri: lb://mall-adminpredicates:- Path=/api/**filters:- RewritePath=/api/(?<segment>.*),/mall-admin/${segment}

通过这种配置方式,当客户端发送请求到/api/users时,Gateway首先检查是否符合Path=/api/**条件。如果符合条件,则应用RewritePath过滤器将路径转换为/mall-admin/users,然后根据负载均衡策略将请求转发给mall-admin服务的一个实例进行处理

结论

请注意,尽管上述配置使用了*作为允许的源,但在生产环境中,出于安全考虑,应该明确指定具体的允许源,而不是使用通配符*。此外,如果需要更复杂的CORS策略,如针对不同路径应用不同的CORS规则,则可能需要进一步定制化配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91820.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扫雷游戏完整代码

扫雷游戏完整代码test.cgame.cgame.h

vue打包后如何在本地运行?

1.打包前的配置打开vue.config.js配置如图所示内容//打包配置文件 module.exports {assetsDir: static,parallel: false,publicPath: ./, };这段代码是Vue.js项目的打包配置文件&#xff0c;主要功能包括&#xff1a; - assetsDir: static - 设置静态资源文件夹名为static - p…

Python特性工厂函数详解:优雅管理属性验证

在Python中&#xff0c;特性(property)是一种强大的工具&#xff0c;它允许我们在访问属性时执行自定义逻辑。本文将深入分析一个名为quantity的特性工厂函数&#xff0c;它用于确保属性值必须为正数。 特性工厂函数的概念 特性工厂函数是一种创建并返回property对象的函数&…

Ubuntu系统VScode实现opencv(c++)鼠标操作与响应

在之前的创作中心-CSDN滚动条调整图片亮度-CSDN博客创作中心-CSDN中,我们已经了解了滚动条实现亮度以及对比度调节,为了实现对图像中感兴趣区域&#xff08;ROI, Region of Interest&#xff09;的交互式选取&#xff0c;本文利用 OpenCV 提供的鼠标事件回调机制&#xff0c;设…

True or False? 基于 BERT 学生数学问题误解检测

True or False? 基于 BERT 学生数学问题误解检测 代码详见&#xff1a;https://github.com/xiaozhou-alt/Student_Math_Misconception 文章目录True or False? 基于 BERT 学生数学问题误解检测一、项目介绍二、文件夹结构三、数据集介绍四、BERT 模型介绍五、项目实现1. 数据…

小程序基于vue+nodejs的私人定做订制订单发布与对应商品出售平台

文章目录项目介绍主要技术与实现手段具体实现截图关于我本系统开发思路研究思路、方法和步骤java类核心代码部分展示系统测试本系统技术可行性分析源码获取详细视频演示或者查看其他版本&#xff1a;文章底部获取博主联系方式&#xff01;项目介绍主要技术与实现手段 uni-app框…

为什么要有动态内存分配?

文章目录1.为什么要有动态内存分配2.malloc和free2.1 malloc2.2 free3.calloc和realloc3.1 calloc3.2 realloc4.常见的动态内存的错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对⾮动态开辟内存使⽤free释放4.4 使⽤free释放⼀块动态开辟内存的⼀部分4.5 对…

docker hub 拉取镜像失败报Get “https://registry-1.docker.io/v2/“: net/http: request canceled while waiting

自己记录一把&#xff0c;给兄弟们避坑 1.上问题报错代码 [rootlocalhost ~]# docker pull hello-world Using default tag: latestError response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connectio…

Hive数仓部署/分层/ETL脚本基础指南

部署Hive数仓及分层基础指南 部署和构建一个Hive数仓涉及多个步骤&#xff0c;包括设置Hadoop集群、配置Hive、设计数据仓库架构以及实现ETL&#xff08;Extract, Transform, Load&#xff09;过程。下面是一个详细的指南&#xff0c;帮助你完成这些步骤。 1. 设置Hadoop集群 首…

深入 Go 底层原理(六):垃圾回收(GC)

1. 引言Go 语言自带垃圾回收&#xff08;Garbage Collection, GC&#xff09;&#xff0c;让开发者从手动管理内存的繁重任务中解脱出来。Go 的 GC 以其低延迟和并发性而闻名&#xff0c;其目标是在不长时间暂停&#xff08;Stop The World, STW&#xff09;整个程序的情况下完…

专网内网IP攻击防御:从应急响应到架构加固

内网IP攻击防御&#xff1a;从应急响应到架构加固内网IP攻击的隐蔽性远超外网威胁&#xff0c;其本质是信任边界内的权限滥用。应对需遵循"识别-隔离-溯源-加固"四步法则&#xff0c;兼顾应急止损与长效防御。应急处置&#xff1a;30分钟响应窗口1. 流量阻断&#xf…

Git、Gitee、GitHub、GitLab完整讲解:从基础到进阶

第一部分&#xff1a;Git是什么&#xff1f; &#x1f4da;比喻&#xff1a;Git就像是一本"时光日记本" ✅ 每一段代码的改动&#xff0c;Git都会帮你记录下来&#xff0c;像是在写日记。 ✅ 如果出现问题或者想查看之前的版本&#xff0c;Git可以带你"穿越回…

WinForm之CheckBox 控件

CheckBox&#xff08;复选框&#xff09;是 WinForm 中用于实现 “多项选择” 的控件&#xff0c;允许用户从一组选项中选择任意数量的项&#xff08;包括零项、一项或多项&#xff09;&#xff0c;适用于需要同时选择多个选项的场景&#xff08;如爱好、权限设置、功能开关等&…

鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种受座头鲸捕食行为启发的群体智能优化算法,由Seyedali Mirjalili于2016年提出

鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种受座头鲸捕食行为启发的群体智能优化算法,由Seyedali Mirjalili于2016年提出。 它通过模拟鲸鱼的狩猎策略(特别是“气泡网捕食”行为)来解决优化问题,广泛应用于函数优化、工程设计、机器学习参数优化等领域。以下…

信息量,惊奇度,熵、KL散度(相对熵),交叉熵、最大似然估计MLE与最小化交叉熵的等价证明、

一&#xff1a; 一些基本概念 1.1 信息量:特定事件所携带的信息多少信息量衡量的是特定事件所携带的信息多少&#xff0c;其数学定义为&#xff1a;其中p(x)是事件x发生的概率。核心思想&#xff1a;越罕见的事件&#xff0c;其携带的信息量越大&#xff1b;越常见的事件&#…

VBA 64位API声明语句第012讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

深入理解Java中String.intern()方法:从原理到并发控制实践

深入理解 Java 中 String.intern () 方法&#xff1a;从原理到并发控制实践 在 Java 开发中&#xff0c;String.intern()方法是一个看似简单却蕴含深意的 API。它在字符串常量池管理、内存优化以及并发控制等场景中有着关键作用。本文将从底层原理出发&#xff0c;结合实际案例…

在Linux中创建LVGL应用

在Linux中创建LVGL应用 简介 上一篇文章介绍了在imx6上开发UI的流程 . 这篇接上文&#xff0c; 介绍具体的开发步骤。 1. 创建项目主目录 mkdir my_lvgl_project cd my_lvgl_project2. 初始化 Git 仓库 (可选但推荐) git init echo "# My Project with Dependencies&…

大模型对比评测:Qwen2.5 VS Gemini 2.0谁更能打?

一、背景与选型关键 在 AI 应用落地的时代&#xff0c;“AI大模型选型对比”成为关键环节。选择合适的模型要综合考量性能、上下文长度、推理能力、中文/编程支持、成本等多维度指标。 本文重点比较 Gemini2.0Flash-Lite &#xff08;Preview&#xff09;、Gemini2.0Flash &a…

转置卷积解释与示例计算

文章目录转置卷积的三种等价实现方法&#xff1a;原理、公式与等价性分析数学定义与核心公式方法一&#xff1a;零填充翻转核卷积&#xff08;数学定义方法&#xff09;原理与公式等价性说明方法二&#xff1a;直接位置映射&#xff08;pytorch框架高效实现&#xff09;原理与公…