微服务-gateway跨域配置
文章目录
- 一、前言
- 二、gateway跨域配置
- 1、问题描述
- 1.1、什么是跨域请求?
- 1.1.1、同源策略
- 1.1.2. 安全性考虑
- 1.1.3. 跨域攻击
- 1.2、问题产生原因
- 2、解决方法
- 2.1、修改配置文件
- 2.2、配置类统一配置
- 2.3、全局跨域拦截器
- 三、总结
一、前言
在SpringCloud项目中,前后端分离目前很常见,在调试时会遇到前端页面通过不同域名或IP访问微服务的后台,此时,如果不加任何配置,前端页面的请求会被浏览器跨域限制拦截,所以,业务服务常常会添加跨域配置
二、gateway跨域配置
1、问题描述
1.1、什么是跨域请求?
跨域请求是指来自不同源(域名、端口或协议)的前端应用发起的HTTP请求。由于浏览器的同源策略,这种请求通常被阻止,除非服务器明确允许。因此,当你的前端应用和后端服务位于不同的域时,就会面临跨域问题。
1.1.1、同源策略
同源策略是浏览器的一项安全措施,旨在防止恶意网站获取用户的敏感数据或进行恶意操作。同源策略规定,一个网页只能从与其来源相同的域名、端口和协议上加载资源,而不能跨域访问其他域名的资源。同源策略的目的是确保不同源之间的数据和行为隔离,以保护用户的隐私和安全。
同源策略的要求包括:
- 协议必须相同(如http和https不同源)。
- 域名必须相同。
- 端口号必须相同。
如果任何一个条件不符合,浏览器将阻止页面通过JavaScript等方式访问其他源的资源。这就是为什么在开发Web应用时,跨域请求会遇到问题的原因之一。
1.1.2. 安全性考虑
跨域问题的另一个原因是安全性考虑。当一个网站允许其他网站通过跨域请求来访问其资源时,存在潜在的安全风险。例如,如果一个网站允许跨域访问其用户数据,恶意网站可以利用这一漏洞来窃取用户的敏感信息。因此,浏览器实施同源策略,限制跨域请求,以减少这种风险。
1.1.3. 跨域攻击
跨域请求还可能导致跨站请求伪造(Cross-Site Request Forgery,CSRF)攻击。CSRF攻击是一种利用用户在已登录的状态下,误导用户发起恶意请求的攻击方式。如果没有适当的跨域控制,攻击者可以伪装成受害者,向其他网站发送请求,以执行未经授权的操作。
1.2、问题产生原因
前端页面地址:http://127.0.0.1:5173/
后端接口地址:http://127.0.0.1:9081/xxxxx
由于浏览器的同源策略,现在是端口不一致导致的跨域问题;

前端调用后端接口的js:


2、解决方法
2.1、修改配置文件
在gateway的配置文件中增加跨域配置:
globalcors: cors-configurations: '[/**]': allowedOrigins: "*" allowedHeaders: "*" allowedMethods: "*" default-filters: - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST
server:port: 9081servlet:context-path: /gateway-demo
spring:application:name: gateway-democloud:nacos:discovery:server-addr: 124.70.79.190:8848namespace: wangmengjiegateway:globalcors:cors-configurations:'[/**]':allowedOrigins: "*"allowedHeaders: "*"allowedMethods: "*"default-filters:- DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRSTdiscovery:locator:enable: true #让gateway可以发现nacos中的微服务routes: #路由,数组[这里可以放置多个路由]#评分管理模块网关路由配置- id: user-router #当前路由标识-要求唯一,默认是UUID;uri: lb://user-demo #请求最终要被转发的地址;order: 1 #路由的优先级——数字越小,代表路由的优先级越高predicates: #断言:(条件判断——转发请求要满足的条件)- Path=/user-service/** #当请求路径满族path指定的规则时,此路由信息才会正常转发;filters: #过滤器,是在请求传递过程中对请求做一些手脚;- StripPrefix=1 #在请求转发之前去掉一层路径
再次进行调用看一下结果:可以看到,接口现在正常返回结果了。

2.2、配置类统一配置
@Configuration
public class FdmallCorsConfiguration {/*** 添加跨域过滤器* @return*/@Bean // 添加过滤器public CorsWebFilter corsWebFilter(){//基于url跨域,选择reactive包下的UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();// 跨域配置信息CorsConfiguration configuration = new CorsConfiguration();// 允许跨域的头configuration.addAllowedHeader("*");// 允许跨域的请求方式configuration.addAllowedMethod("*");// 允许跨域的请求来源configuration.addAllowedOrigin("*");// 是否允许携带cookie跨域configuration.setAllowCredentials(true);// 任意url都要进行跨域配置source.registerCorsConfiguration("/**", configuration);return new CorsWebFilter(source);}
}
检查请求是否为OPTIONS方法(预检请求)。如果是,我们返回HTTP状态码200 OK,以满足浏览器的预检请求。
设置允许的来源(Access-Control-Allow-Origin)为"*",这意味着允许来自任何域的请求。在生产环境中,应根据需要将其设置为特定的域名。
设置允许的HTTP方法(Access-Control-Allow-Methods),通常是GET、POST、PUT、DELETE和OPTIONS。
设置允许的HTTP头信息(Access-Control-Allow-Headers),通常是Content-Type和Authorization。
注: SpringCloudGateWay中跨域配置不起作用,原因是SpringCloudGetway是Springwebflux的而不是SpringWebMvc的,所以我们需要导入的包导入错了。
2.3、全局跨域拦截器
@Order(10)
@Component
public class CorsResponseHeaderFilter implements GlobalFilter {private static final String ANY = "*";@Override@SuppressWarnings("serial")public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return chain.filter(exchange).then(Mono.fromRunnable(() -> {exchange.getResponse().getHeaders().entrySet().stream().filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1)).filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)|| kv.getKey().equals(HttpHeaders.VARY))).forEach(kv ->{// Vary只需要去重即可if(kv.getKey().equals(HttpHeaders.VARY))kv.setValue(kv.getValue().stream().distinct().collect(Collectors.toList()));else{List<String> value = new ArrayList<>();if(kv.getValue().contains(ANY)){ //如果包含*,则取*value.add(ANY);kv.setValue(value);}else{value.add(kv.getValue().get(0)); // 否则默认取第一个kv.setValue(value);}}});}));}
}
三、总结
在Web应用程序中,跨域请求是一个常见的问题。当两个不同的域之间进行通信时,由于浏览器的同源策略,会出现跨域问题。在Spring Cloud Gateway中,可以通过配置来解决这个问题。Spring Cloud Gateway是Spring Cloud生态系统中提供的一种API网关,它可以对进出应用程序的所有请求进行拦截、管理和路由。通过配置,可以实现对请求的过滤、认证、路由、限流等功能。
如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。
相关文章:
微服务-gateway跨域配置
文章目录 一、前言二、gateway跨域配置1、问题描述1.1、什么是跨域请求?1.1.1、同源策略1.1.2. 安全性考虑1.1.3. 跨域攻击 1.2、问题产生原因 2、解决方法2.1、修改配置文件2.2、配置类统一配置2.3、全局跨域拦截器 三、总结 一、前言 在SpringCloud项目中&#x…...
爬虫项目(二):中国大学排名
《Python网络爬虫入门到实战》京东购买地址,这里讲解了大量的基础知识和实战,由本人编著:https://item.jd.com/14049708.html配套代码仓库地址:https://github.com/sfvsfv/Crawer文章目录 分析第一步:获取源码分析第一…...
十二、MySQL(DQL)分组/排序/分页查询如何实现?
总括 select 字段列表 from 表名 [where 条件] (group by)/(order by)/(limit) 分组字段名 分组查询 1、分组查询 (1)基础语法: select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组之后的过滤条件] (…...
设计模式概念学习
创建类型 单例模式 饿汉 构建时就创建 懒汉 单线程-访问到的时候才创建多线程-低效率 做法:加锁->若未创建则创建->获取资源->解锁 缺点:效率低,每次访问之前都要加锁,资源创建之后不能被同时被多个线程访问多线程-…...
Spring MVC 五 - DispatcherServlet初始化过程(续)
今天的内容是SpringMVC的初始化过程,其实也就是DispatcherServilet的初始化过程。 Special Bean Types DispatcherServlet委托如下一些特殊的bean来处理请求、并渲染正确的返回。这些特殊的bean是Spring MVC框架管理的bean、按照Spring框架的约定处理相关请求&…...
day36:网编day3,TCP、UDP模型
下载: #include <myhead.h>#define ERR(s) do\ {\fprintf(stderr,"__%d__",__LINE__);\perror(s);\ }while(0) #define PORT 69 #define IP "192.168.115.184"int do_download(int cfd,struct sockaddr_in sin); //int do_upload(); int…...
MySQL——MySQL的基础操作部分
使用命令行登录 mysql -u root -p 直接敲击回车后输入密码即可: 当看到出现“mysql>“的符号之后,就表示已经进入到了MySQL系统中,就可以输入My…...
编译OpenWrt内核驱动
编译OpenWrt内核驱动可以参考OpenWrt内部其它驱动的编写例程,来修改成自己需要的驱动 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码: git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update -…...
文件上传漏洞-upload靶场5-12关
文件上传漏洞-upload靶场5-12关通关笔记(windows环境漏洞) 简介 在前两篇文章中,已经说了分析上传漏的思路,在本篇文章中,将带领大家熟悉winodws系统存在的一些上传漏洞。 upload 第五关 (大小写绕过…...
Redis功能实战篇之Session共享
1.使用redis共享session来实现用户登录以及token刷新 当用户请求我们的nginx服务器,nginx基于七层模型走的事HTTP协议,可以实现基于Lua直接绕开tomcat访问redis,也可以作为静态资源服务器,轻松扛下上万并发, 负载均衡…...
leetcode235. 二叉搜索树的最近公共祖先(java)
二叉搜索树的最近公共祖先 题目描述递归 剪枝代码演示: 上期经典 题目描述 难度 - 中等 LC235 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q…...
2023物联网新动向:WEB组态除了用于数据展示,也支持搭建业务逻辑,提供与蓝图连线和NodeRed规则链类似的可视化编程能力
前言 组态编辑在工业控制、物联网场景中十分常见,越来越多的物联网平台也把组态作为一项标配功能。 物联网产业链自下往上由“端 - 边 - 管 - 云 -用”多个环节构成,组态通常是用于搭建数据展示类型的应用,而随着系统集成度越来越高&#x…...
react将文件转为base64进行上传
需求 将图片、pdf、word、excel等文件进行上传。图片、pdf等调接口A、word、excel等附件调接口B。接口关于文件是base64格式的参数 业务场景 上传资源,区分影像与附件 逻辑思路 使用原生input标签,typefile,进行上传上传后的回调&#x…...
生成式人工智能能否使数字孪生在能源和公用事业行业成为现实?
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 克服障碍,优化数字孪生优势 要实现数字孪生的优势,您需要数据和逻辑集成层以及基于角色的演示。如图 1 所示,在任何资产密集型行业(如能源和公用事业)中&…...
SpringBoot集成JWT token实现权限验证
JWTJSON Web Token 1. JWT的组成 JWTHeader,Payload,Signature>abc.def.xyz 地址:JSON Web Tokens - jwt.er 1.1 Header Header:标头。 两个组成部分:令牌的类型(JWT)和所使用的签名算法,经过Base64 Url编码后形成…...
算法通关村第11关【青铜】| 位运算基础
1.数字在计算机中的表示 原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。 原码(Sign-Magnitude): 原码最简单,它的表示方式是用最高位表示符号位,0表示…...
无涯教程-Android - RadioGroup函数
RadioGroup类用于单选按钮集。 如果我们选中属于某个单选按钮组的一个单选按钮,它将自动取消选中同一组中以前选中的任何单选按钮。 RadioGroup属性 以下是与RadioGroup控制相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关…...
降噪音频转录 Krisp: v1.40.7 Crack
主打人工智能降噪服务的初创公司「Krisp」近期宣布推出音频转录功能,能对电话和视频会议进行实时设备转录。该软件还整合的ChatGPT,以便快速总结内容,开放测试版于今天上线。 随着线上会议越来越频繁,会议转录已成为团队工作的重…...
基于React实现:弹窗组件与Promise的有机结合
背景 弹窗在现代应用中是最为常见的一种展示信息的形式,二次确认弹窗是其中最为经典的一种。当我们在React,Vue这种数据驱动视图的前端框架中渲染弹窗基本是固定的使用形式。 使用方式:创建新的弹窗组件,在需要弹窗的地方引用并…...
docker使用(一)生成,启动,更新(容器暂停,删除,再生成)
docker使用(一) 编写一个 Dockerfile构建镜像构建失败构建成功 运行镜像运行成功 修改代码后再次构建请不要直接进行构建,要将原有的旧容器删除或暂停停止成功删除成功再次构建且构建成功! 要创建一个镜像,你可以按照以…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
