Multiple CORS header ‘Access-Control-Allow-Origin‘ not allowed

news2024/11/24 16:49:05

今天在修改天天生鲜超市项目的时候,因为使用了前后端分离模式,前端通过网关统一转发请求到后端服务,但是第一次使用就遇到了问题,比如跨域问题:

但是,其实网关里是有配置跨域的,只是忘了把前端项目的IP和端口号添加到设置里

server:
  port: 9091
  servlet:
    context-path: /

spring:
  profiles:
    active: dev
  cloud:
    gateway:
      enabled: true
      # 开启自动路由
      discovery:
        locator:
          enabled: true
      routes:
        # fresheveryday
        - id: gateway-fresheveryday
          uri: lb://fresheveryday
          predicates:
            - Path=/api/fresheveryday/**
          filters:
            - StripPrefix=2

      httpclient:
        connect-timeout: 1000 # 配置连接超时
        response-timeout: 5s # 配置响应超时

      # 跨域配置
      globalcors:
        add-to-simple-url-handler-mapping: true
        cors-configurations:
          '[/**]': #拦截的请求
            maxAge: 36000 #跨域检测的有效期,单位s
            allowedOrigins: #允许跨域的请求
              - "http://localhost:8080" # mhxysy
              - "http://localhost:8081" # layui
              - "http://localhost:8099" # authority
            allowedMethods: #允许跨域的请求方式
              - "GET"
              - "POST"
            allowedHeaders: "*" #允许请求中携带的头信息
            allowedCredentials: true #是否允许携带cookie

logging:
  level:
    springfox: error
    cn.edu.sgu.www.gateway: debug

如上所示,allowedOrigins里设置的是之前使用网关的服务,在nacos控制台修改gateway-dev.yml

添加超市前端项目ttsx的访问地址

server:
  port: 9091

spring:
  application:
    name: gateway
  cloud:
    # 网关配置
    gateway:
      enabled: true
      # 开启自动路由
      discovery:
        locator:
          enabled: true
      routes:
        # authority
        - id: gateway-authority
          uri: lb://authority
          predicates:
            - Path=/api/authority/**
          filters:
            - StripPrefix=2

        # mhxysy
        - id: gateway-mhxysy
          uri: lb://mhxysy
          predicates:
            - Path=/api/mhxysy/**
          filters:
            - StripPrefix=2

        # layui
        - id: gateway-layui
          uri: lb://layui
          predicates:
            - Path=/api/layui/**
          filters:
            - StripPrefix=2

        # fresheveryday
        - id: gateway-fresheveryday
          uri: lb://fresheveryday
          predicates:
            - Path=/api/fresheveryday/**
          filters:
            - StripPrefix=2
      
      httpclient:
        connect-timeout: 1000 # 配置连接超时
        response-timeout: 5s # 配置响应超时

      # 跨域配置
      globalcors:
        add-to-simple-url-handler-mapping: true
        cors-configurations:
          '[/**]': #拦截的请求
            maxAge: 36000 #跨域检测的有效期,单位s
            allowedOrigins: #允许跨域的请求
              - "http://localhost:8080" # mhxysy
              - "http://localhost:8081" # layui
              - "http://localhost:8088" # ttsx
              - "http://localhost:8099" # authority
            allowedMethods: #允许跨域的请求方式
              - "GET"
              - "POST"
            allowedHeaders: "*" #允许请求中携带的头信息
            allowedCredentials: true #是否允许携带cookie

logging:
  file:
    name: D:/log/gateway.log
  level:
    springfox: error
    cn.edu.sgu.www.gateway: debug

添加完之后,重启网关服务gateway,然后再次点登录按钮,还是报错了~

两次请求其实都正常返回响应数据了,状态码为200,这次的错误原因

Multiple CORS header 'Access-Control-Allow-Origin' not allowed

点击右边的问号,原因找到了,服务端返回了两个Access-Control-Allow-Origin响应头,因为网关配置了跨域,后台系统也配置了跨域,所以是gateway和fresheverday的响应头一起返回给了前端。

遇到这个问题应该怎么解决呢?

不要慌,有文档,gateway不是给我们提供了很多过滤器工厂吗,打开官网看一下。

因为博主用的springcloud版本为2.2.6.RELEASE,所以在Spring官网打开的spring cloud gateway的文档页面地址对应的版本处改成2.2.6.RELEASE。

https://docs.spring.io/spring-cloud-gateway/docs/2.2.6.RELEASE/reference/html/#the-deduperesponseheader-gatewayfilter-factory

然后看一下全局过滤器工厂,找到响应头相关的过滤器,如图,很快就找到一个

右边红框内的英文大概意思是会删除两个请求头Access-Control-Allow-CredentialsAccess-Control-Allow-Origin重复的值,一旦网关的cors和下游的cors策略都添加了它们。

看到这句英语原话,不由嘴角微动,就是它了,不费吹灰之力。

于是在网关的配置加上上面的配置

        # fresheveryday
        - id: gateway-fresheveryday
          uri: lb://fresheveryday
          predicates:
            - Path=/api/fresheveryday/**
          filters:
            - StripPrefix=2
            - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

重启一下网关服务gateway,点击登录成功跳转到了首页,问题完美解决~

好了,文章就分享到这里了~

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

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

相关文章

如何解决版本不兼容Jar包冲突问题

如何解决版本不兼容Jar包冲突问题 引言 “老婆”和“妈妈”同时掉进水里,先救谁? 常言道:编码五分钟,解冲突两小时。作为Java开发来说,第一眼见到ClassNotFoundException、 NoSuchMethodException这些异常来说&…

【数据结构】排序(1) ——插入排序 希尔排序

目录 一. 直接插入排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 希尔排序 基本思想 代码实现 时间和空间复杂度 稳定性 一. 直接插入排序 基本思想 把待排序的记录按其关键码值的大小依次插入到一个已经排好序的有序序列中,直到所有的记录插入完为止&…

gazebo场景很暗

解决方法 在gazebo中,点击左侧上边scene,然后下面把shadows选择false可以使画面更亮。 转载来自: 链接

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③ 第十九章 驱动程序基石③19.5 定时器19.5.1 内核函数19.5.2 定时器时间单位19.5.3 使用定时器处理按键抖动19.5.4 现场编程、上机19.5.5 深入研究:定时器的内部机制19.5.6 深入研究:找到系统滴答 1…

kafka客户端应用参数详解

一、基本客户端收发消息 Kafka提供了非常简单的客户端API。只需要引入一个Maven依赖即可&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.13</artifactId><version>3.4.0</version></depend…

阿里云OSS图片存储

阿里云对象存储 OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供最高可达 99.995 % 的服务可用性。多种存储类型供选择&#xff0c;全面优化存储成本。 视频介绍 创建bucket 开发文档 上传文件demo &#x…

ios证书类型及其作用说明

ios证书类型及其作用说明 很多刚开始接触iOS证书的开发者可能不是很了解iOS证书的类型功能和概念。下面对iOS证书的几个方面进行介绍。 apple开发账号分类&#xff1a; 免费账号&#xff1a; 无需支付费用给apple&#xff0c;使用个人信息注册的账号 可以开发测试安装&…

Golang语法、技巧和窍门

Golang简介 命令式语言静态类型语法标记类似于C&#xff08;但括号较少且没有分号&#xff09;&#xff0c;结构类似Oberon-2编译为本机代码&#xff08;没有JVM&#xff09;没有类&#xff0c;但有带有方法的结构接口没有实现继承。不过有type嵌入。函数是一等公民函数可以返…

Scala第十章

Scala第十章 章节目标 1.数组 2.元组 3.列表 4.集 5.映射 6.迭代器 7.函数式编程 8.案例&#xff1a;学生成绩单 scala总目录 文档资料下载

【Python】time模块和datetime模块的部分函数说明

时间戳与日期 在说到这俩模块之前&#xff0c;首先先明确几个概念&#xff1a; 时间戳是个很单纯的东西&#xff0c;没有“时区”一说&#xff0c;因为时间戳本质上是经过的时间。日常生活中接触到的“日期”、“某点某时某分”准确的说是时间点&#xff0c;都是有时区概念的…

有时候,使用 clang -g test.c 编译出可执行文件后,发现 gdb a.out 进行调试无法读取符号信息,为什么?

经过测试&#xff0c;gdb 并不是和所有版本的 llvm/clang 都兼容的 当 gdb 版本为 9.2 时&#xff0c;能支持 9.0.1-12 版本的 clang&#xff0c;但无法支持 16.0.6 版本的 clang 可以尝试使用 LLVM 专用的调试器 lldb 我尝试使用了 16.0.6 版本的 lldb 调试 16.0.6 的 clan…

牛客题霸 -- DP41 【模板】01背包

解题步骤&#xff1a; 参考代码&#xff1a; 未优化的代码&#xff1a; int n; int V; const int N1010; int v[N]; int w[N]; int dp[N][N];int main() {cin>>n>>V;for(int i1;i<n;i){cin>>v[i]>>w[i];}//第一问//第一行全是0&#xff0c;不用初…

Ubuntu20 QT6.0 编译 ODBC 驱动

一、新建测试项目 新建一个控制台项目&#xff0c; // main.cpp #include <QCoreApplication> #include <QSqlDatabase> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 获取当前Qt支持的驱动列表QStringList driv…

IDEA2023 常用配置(JDK/系统设置等常用配置)

目录 一、JDK及编译目录设置 1 项目的JDK设置 2 out目录和编译版本 二、相关详细设置 1 打开详细配置界面 1、显示工具栏 2、默认启动项目配置 3、取消自动更新 2 设置整体主题 1、选择主题 2、设置菜单和窗口字体和大小 3、设置IDEA背景图 3 设置编辑器主题样式…

八、混合整数线性规划问题

文章目录 1、混合整数线性规划问题2、分枝定界算法2.1、分枝策略 THE END 1、混合整数线性规划问题 \qquad 混合整数线性规划问题的一般表示形式如下所示&#xff1a;假设现有 n n n个变量&#xff0c; m m m个约束&#xff0c;令最大化(或者最小化) c 1 x 1 c 2 x 2 . . . …

数据结构与算法----递归

1、迷宫回溯问题 package com.yhb.code.datastructer.recursion&#xffe5;5;public class MiGong {public static void main(String[] args) {// 先创建一个二维数组&#xff0c;模拟迷宫// 地图int[][] map new int[8][7];// 使用1 表示墙// 上下全部置为1for (int i 0; i…

VRRP配置案例(路由走向分析,端口切换)

以下配置图为例 PC1的配置 acsw下行为access口&#xff0c;上行为trunk口&#xff0c; 将g0/0/3划分到vlan100中 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname acsw [acsw] Sep 11 2023 18:15:48-08:00 acsw DS/4/DATASYNC_CFGCHANGE:O…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石②

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石② 第十九章 驱动程序基石②19.3 异步通知19.3.1 适用场景19.3.2 使用流程19.3.3 驱动编程19.3.4 应用编程19.3.5 现场编程19.3.6 上机编程19.3.7 异步通知机制内核代码详解 19.4 阻塞与非阻塞19.4.1 应用编程19.4.2 驱动编程…

26-网络通信

网络通信 什么是网络编程&#xff1f; 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09;。 java.net.包下提供了网络编程的解决方案&#xff01; 基本的通信架构有2种形式&#xff1a;CS架构&#xff08; Client客户端/Server服…

Python无废话-办公自动化Excel修改数据

如何修改Excel 符合条件的数据&#xff1f;用Python 几行代码搞定。 需求&#xff1a;将销售明细表的产品名称为PG手机、HW手机、HW电脑的零售价格分别修改为4500、5500、7500&#xff0c;并保存Excel文件。如下图 Python 修改Excel 数据&#xff0c;常见步骤&#xff1a; 1&…