The ‘Access-Control-Allow-Origin’ header contains multiple values “*, *”, but only one is allowed.

这篇博客讨论了在Spring Gateway中遇到的双重跨域异常,解释了原因并提供了解决方案。作者提到,当跨域配置在不同层级(如代码、网关和Nginx)同时存在时,会导致此问题。为了解决这个问题,可以选择在一处删除重复的配置,或者在网关层通过配置忽略双重跨域。示例配置展示了如何在Spring Gateway的全局 CORS 配置中使用'DedupeResponseHeader'来保留唯一的'Access-Control-Allow-Origin'头。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The ‘Access-Control-Allow-Origin’ header contains multiple values “*, *”, but only one is allowed.

通常我们的跨域可以在三个地方解决

  1. 通过配置类在后台代码解决 。还可以通过注解在接口上解决。
  2. 可以在业务网管层面解决。
  3. 可以在nginx层面解决。

以上的三种方式,假如用了两种。则会出现双重跨域的异常错误。

解决方案

  1. 如果知道在哪里用了两次跨域的话,选择剔除一个地方也是可以的。假如在业务网关层统一解决跨域的,那就在代码层移除掉跨域的部分配置。
  2. 如果两个地方都不想移除,还可以在网管层通过配置,来忽略掉双重跨域的问题。

我的业务网管层,是使用的gateway。而双重跨域的解决方案我选择的是在gateway网关层解决。

spring:
  main:
    allow-bean-definition-overriding: true
    gateway:
      discovery:  #是否与服务发现组件进行结合,通过 serviceId(必须设置成大写) 转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能。
        locator:  #路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问,配置lowerCaseServiceId可用小写。
          enabled: true
          lowerCaseServiceId: true
      #解决跨域问题
      globalcors:
        corsConfigurations:
          '[/**]':
            # 允许携带认证信息
            allow-credentials: true
            # 允许跨域的源(网站域名/ip),设置*为全部
            allowedOrigins: "*"
            # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
            allowedMethods: "*"
            # 允许跨域请求里的head字段,设置*为全部
            allowedHeaders: "*"
      #解决双重跨域 RETAIN_FIRST RETAIN_LAST RETAIN_UNIQUE
      default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials Vary, RETAIN_UNIQUE

其中发挥作用的是:

default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials Vary, RETAIN_UNIQUE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值