针对springcloud gateway 跨域问题解决方案

springcloud gateway版本

<spring-boot.version>2.3.3.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>

在这里插入图片描述
在这里插入图片描述

跨域问题说明

application:1 Access to XMLHttpRequest at 'https://xxxxxxxxxx' from origin 'http://localhost:3001' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

这里仅说明在同一注册中心注册的服务,网关可以通过在注册中心的服务名称对应找到服务进行路由转发,因此这种情况,不存在跨域问题。
但是对于一些通过nginx反向代理到网关服务下的请求进行访问时,就存在跨域问题。所以下面网关
跨域的原理和理论待补充

什么是域

域是由网络上的用户和计算机组成的一个逻辑或逻辑集合,域中所有的对象都存储在活动目录下,一个网络可以建立一个或者多个域,每个域都是一个安全界限,意味着各种权限不能跨域。

URL

URL:Uniform Resource Locator,统一资源定位器,他是www的统一资源定位标志,就是指网络地址。
URL组成:协议、主机、端口、路径【http://www.baidu.com:80】
(服务类型(HTTP或者HTTPS://主机名(域名或者IP地址)[:端口号]/文件路径/资源名称?参数=参数值&参数=参数值#片段标志符
在www.baidu.com的域名中,com成为顶级域名,baidu称为2级域名,www称为3级域名

跨域是什么?

跨域概念:

跨域是指浏览器不能执行其他网站的脚本,是因为浏览器的同源策略造成的,是浏览器的安全限制

同源概念

同源概念:域名、协议、端口号均相同

注: 二级域名不同,发起请求也是跨域请求,可以在header里面添加域名限制,也可以修改domain
将子域和主域的document.domain设为同一个主域

前提条件: 这两个域名必须属于同一个基础域名,而且所用的协议,端口号都要一致,否则无法利用document.domain进行跨域

所以当协议,子域名,主域名,端口号中任意-各不相同,都算不同的域。他们之间请求资源都是跨域。

为什么有跨域

为了安全,浏览器执行javascript脚本的时候,会检查这个脚本属于哪个页面,不是同源页面,就不会被执行。
同源策略的主要目的是为了防止XSS(跨站脚本攻击)【反射性,非反型、基于DOM】、CSRF(跨域请求伪造等恶意攻击)
但是在实际开发中,经常会有跨域加载资源的需求,比如我们直接使用饮用

网关跨域解决

针对跨域问题,这里提供两种解决方案,仅供参考

方案一 网关proties文件添加配置

spring cloud gateway提供了可以直接通过在yaml文件中配置的方式解决跨域问题,具体的类配置可以查看源码中对应的类org.springframework.cloud.gateway.config.GlobalCorsProperties,源码地址如下:
源码地址
网关配置如下

# 解决Option请求被拦截的问题
spring.cloud.gateway.globalcors.corsConfigurations.[/**].add-to-simple-url-handler-mapping = true
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedOrigins = *
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedHeaders = *
spring.cloud.gateway.globalcors.corsConfigurations.[/**].exposedHeaders = X-trace-id
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedMethods = *
spring.cloud.gateway.globalcors.corsConfigurations.[/**].maxAge = 3600

说明:
由于spring-framework从5.3.0版本开始,关于CORS跨域配置类CorsConfiguration中将allowedOrigins变量名修改为allowedOriiginPatterns(spring-framework项目对应的类信息)
spring-framework项目对应的类信息
对于高于5.3.0版本请使用如下配置:

# 解决Option请求被拦截的问题
spring.cloud.gateway.globalcors.corsConfigurations.[/**].add-to-simple-url-handler-mapping = true
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedOriginPatterns = *
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedHeaders = *
spring.cloud.gateway.globalcors.corsConfigurations.[/**].exposedHeaders = X-trace-id
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedMethods = *
spring.cloud.gateway.globalcors.corsConfigurations.[/**].maxAge = 3600

针对此解决方案,官方文档有对应的配置说明,具体可参看下图,下图中红线框出部分需要在配置时注意,记得添加上add-to-simple-url-handler-mapping配置,官方文档地址如下:https://docs.spring.io/spring-cloud-gateway/docs/3.1.4/reference/html/#cors-configuration

在这里插入图片描述

方案二:网关注入配置类

Spring Cloud Gateway提供了跨域的配置类,然后在网关项目代码中添加一个CorsWebFilter类即可实现,关于网关提供的Cors配置类,可参看官方文档https://docs.spring.io/spring-framework/docs/5.0.x/javadoc-api/org/springframework/web/cors/CorsConfiguration.html)

@Configuration
public class GlobalCorsConfig {@Beanpublic CorsWebFilter corsWebFilter() {CorsConfiguration config = new CorsConfiguration();// 这里仅为了说明问题,配置为放行所有域名,生产环境请对此进行修改config.addAllowedOrigin("*");// 放行的请求头config.addAllowedHeader("*");// 放行的请求方式,主要有:GET, POST, PUT, DELETE, OPTIONSconfig.addAllowedMethod("*"); // 暴露头部信息config.addExposedHeader("*"); // 是否发送cookieconfig.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

注意

配置使用看是否是https或者是http这里可以采用post确认一下

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

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

相关文章

原生JS如何实现验证码

在原生JavaScript中实现验证码通常涉及到创建一些随机字符或图像&#xff0c;然后让用户输入这些字符以验证他们的身份。以下是一个简单的示例&#xff0c;说明如何使用原生JavaScript创建一个基于文本的验证码。 创建验证码字符串&#xff1a;首先&#xff0c;我们需要一个函…

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境&#xff12;、配置远程连接3、其他配置入口 跑新项目&#xff0c;有个confluent-Kafka-go的依赖在Windows上编译不通过&#xff0c;报错信息&#xff1a; undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持&#xff0c;选择让…

IMX6ULL-UBOOT驱动移植

介绍 IMX6ULL正点原子开发板使用的是14x14_evk的芯片 其中14x14代表的是芯片的尺寸。 本教程的标识符以nsouther或者 NSOUTHER NSouther为主 添加板子自己的配置文件 板子的默认配置文件保存在 configs目录下&#xff0c;我们以mx6ull_14x14_evk_emmc_defconfig为主&#xf…

SOT23-6封装单键触摸感应触发芯片TC233A

前言&#xff1a; 触摸芯片很多&#xff0c;现在触摸按键已经应用到很多行业&#xff0c;虽然不能覆盖所有的按键&#xff0c;但确实用的越来越多&#xff0c;国产的价格也便宜的令人发指&#xff0c;比如这个TC233A&#xff0c;也就一毛多一点。 TC233A概述 TC233A 是一个单…

vue 钩子函数

目录 钩子函数概念 生命周期钩子函数 keep-alive 钩子函数 自定义指令的钩子函数 路由导航 / 路由守卫 钩子函数 全局守卫 路由独享守卫 导航守卫 钩子函数概念 在 vue 中可以自动执行的函数叫做钩子函数 生命周期钩子函数 vue 从实例创建到销毁过程中被自动执行的函…

Logback:新版本报no applicable action for [Encoding]问题

logback.xml配置文件如下 <?xml version"1.0" encoding"UTF-8"?><configuration><include resource"org/springframework/boot/logging/logback/base.xml"/><!-- 日志输出的通道 --><appender name"STDOUT&qu…

mac tcp实现客户端与服务端进行图像传输及处理

客户端发送图像到服务端&#xff0c;服务端对图像进行处理&#xff0c;在将处理后的图像发送到客户端&#xff0c;并且服务端持续监听客户端。 客户端 #include <iostream> #include <fstream> #include <vector> #include <unistd.h> #include <…

【Shell语言】linux中awk命令

linux中awk命令 看这里放声嘶吼谁也不舍得沉默 宽阔也抓不住我下一秒钟的echo ——《暂时失控》苏打绿 awk命令简介 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 B…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗&#xff1f; 岁数大了&#xff0c;希望如何学习新知识呢&#xff1f;又觉得自己哪些能力亟需补强呢&#xff1f; 看论文自然得用Kimi&#xff0c;主要是肝不动了&#xff0c;眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

【Java】ArrayList removeIf() 方法

removeIf() 方法用于删除所有满足特定条件的数组元素。 removeIf()方法的语法为&#xff1a; arraylist.removeIf(Predicate<E> filter) 注&#xff1a;arraylist 是 ArrayList 类的一个对象。 参数说明&#xff1a;filter - 过滤器&#xff0c;判断元素是否要删除 返回…

Python中的Super方法实现问题及解决方案

1、问题背景 在Python中&#xff0c;super方法用于在子类中调用父类的方法。Guido van Rossum曾给出了一个纯Python实现的super方法&#xff0c;以便更好地理解其工作原理。然而&#xff0c;在这个实现中&#xff0c;存在一个问题&#xff1a;当传入的对象不是要调用的父类的实…

C++入门 (2)

文章目录 C入门C输入输出缺省参数全缺省半缺省函数声明与定义分离 函数重载C支持函数重载的原理--名字修饰 C入门 C输入输出 C输入输出包含在# include《iostream》中 cout 类似在控制台中输出&#xff0c;使用cout需要使用流插入符&#xff08;<<&#xff09; 这个符号…

代码随想录训练营-15day:二叉树4

一、平衡二叉树 平衡二叉树的定义&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 使用递归方式&#xff1a;首先需要知道高度是什么意思&#xff0c;怎么获取高度。如果高度差大于1了&#xff0c;那么回复高度就没有意义了。 /*** Definition for…

Hotcoin4月16日上新热门资产:头部RWA技术提供方Centrifuge(CFG)

Hotcoin持续为全球600万用户发掘优质潜力资产&#xff0c;热门币种交易上热币。一文快速了解今日上新资产:Centrifuge(CFG) 推荐指数 8.2 交易对 CFG/USDT 交易时间 4月16日 19:00 资产赛道 RWA 项目简介 Centrifuge是一个去中心化资产融资协议&#xff0c;专注于释放现实世界资…

leetcode刷题(python)——(三)

01.02.02 练习题目&#xff08;第 03 天&#xff09; 1. 0066. 加一 1.1 题目大意 描述&#xff1a;给定一个非负整数数组&#xff0c;数组每一位对应整数的一位数字。 要求&#xff1a;计算整数加 1 1 1 后的结果。 说明&#xff1a; 1 ≤ d i g i t s . l e n g t h ≤…

网关模式和网桥模式的区别

网关&#xff0c;大家都知道&#xff0c;从一个房间走到另一个房间&#xff0c;必然要经过一扇门。同样&#xff0c;从一个网络向另一个网络发送信息&#xff0c;也必须经过一道“关口”&#xff0c;这道关口就是网关。顾名思义&#xff0c;网关(Gateway)就是一个网络连接到另一…

Object.hasOwn is not a function

背景 开发一个H5页面,使用Object.hasOwn来测试属性是否存在,在error监控中,发现某些用户访问会出现如下报错: 问题分析 因为不是所有的用户都报错,继而先去mdn上查看这个api的浏览器兼容性: Object.hasOwn() - JavaScript | MDN 从【Can I Use】上也查看了此web技术的…

STM32串口通信

一、串口发送 1.初始化引脚 void Serial_Init(uint32_t BaudRate) {RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA ,ENABLE );RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 ,ENABLE );GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP…

[疑难杂症2024-003]如何判断一张没有头信息的dcm图像,是否是压缩图像?

本文由Markdown语法编辑器编辑完成&#xff0e; 1. 前言: DCM格式&#xff0c;是医学图像领域里面的通用格式&#xff0e;DCM图像一般分为两大部分&#xff0c;一部分是TAG信息&#xff0c;一部分是像素. 而TAG信息&#xff0c;一般又会分为两部分&#xff0c;如下图所示, 是…

C++_智能指针

文章目录 前言一、智能指针原理二、库支持的智能指针类型1.std::auto_ptr2.std::unique_ptr3.std::shared_ptr4.std::weak_ptr 三、删除器总结 前言 智能指针是一种采用RAII思想来保护申请内存不被泄露的方式来管理我们申请的内存&#xff0c;对于RAII&#xff0c;我们之前也已…