当前位置: 首页 > news >正文

记录一次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.dtcms.com/a/312172.html

相关文章:

  • 【Shell自动化脚本——for循环创建账户,测试主机连通性,for循环密码的修改】
  • 【Java面试题】一分钟了解反射机制
  • 切换python多版本
  • 中州养老项目:Mybatis自动填充拦截器
  • 机器学习项目从零到一:加州房价预测模型(PART 2)
  • 李宏毅深度学习教程 第6-7章 自注意力机制 + Transformer
  • NVIDIA GPU架构
  • 浅拷贝与深拷贝的区别
  • 断路器瞬时跳闸曲线数据获取方式
  • 关于Sort的补充
  • SpringBoot 02 AOP
  • 王者荣耀模拟器:一款基于Python的文本角色扮演游戏
  • 译| Netflix内容推荐模型的一些改进方向
  • 测试时扩散的深度研究助手
  • Redis实战(6)-- 慢查询运用与理解
  • 图像加密学习日志————论文学习DAY4
  • 档案馆可视化:历史宝库的数字新貌
  • 使用 MySQL Shell 进行 MySQL 单机到 InnoDB Cluster 的数据迁移实践
  • 【Django】-5- ORM的其他用法
  • RAWINPUT避坑指南(涉及GetRawInputData/GetRawInputBuffer)
  • 详解Python标准库之命令行界面库
  • .env 文件
  • WinMerge:文件对比工具,支持各种格式文件对比,永久免费使用!
  • 软件交付终极闸口:验收测试全解析
  • GCC(GNU Compiler Collection)与人工智能实例
  • 基于深度学习的医学图像分析:使用MobileNet实现医学图像分类
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年12月18日真题
  • 【Linux】Linux编译器-gcc/g++使用
  • 广东省省考备考(第六十四天8.2)——判断推理(重点回顾)
  • 【领域热点】人工智能与大模型应用:开启软件领域新革命