微服务-gateway跨域配置

news/2024/7/2 19:25:04/文章来源:https://blog.csdn.net/wmj20001225/article/details/132661789

文章目录

  • 一、前言
  • 二、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网关,它可以对进出应用程序的所有请求进行拦截、管理和路由。通过配置,可以实现对请求的过滤、认证、路由、限流等功能。

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

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

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

相关文章

四川玖璨电子商务有限公司:短视频及直播运营

​ &#xfeff;短视频及直播运营是当下最火热的互联网行业之一&#xff0c;它以轻松、有趣的方式改变了人们的生活和娱乐方式。作为一名短视频及直播运营实训学员&#xff0c;我有幸得到了具体的操作指导和实践机会&#xff0c;让我对这个行业有了更深入的了解。 在短视频及直…

官方发布:Mac 版 Visual Studio IDE将于明年 8 月 31 日停止支持

近日&#xff0c;微软官方宣布&#xff1a;适用于 Mac 平台的 Visual Studio 集成开发环境&#xff08;IDE&#xff09;已经启动 "退休" 进程。Visual Studio for Mac 17.6 将继续支持 12 个月&#xff0c;持续到 2024 年 8 月 31 日。 微软表示在未来的 1 年内将重…

VSCode 配置 C 语言编程环境

目录 一、下载 mingw64 二、配置环境变量 三、三个配置文件 四、格式化代码 1、安装插件 2、保存时自动格式化 3、左 { 不换行 上了两年大学&#xff0c;都还没花心思去搭建 C 语言编程环境&#xff0c;惭愧&#xff0c;惭愧。 一、下载 mingw64 mingw64 是著名的 C/C…

css中的z-index是什么

css中的z-index是什么 在 CSS 中&#xff0c;有一个属性可以显式控制 HTML 元素的堆叠顺序&#xff1a;z-index。具有较高值的​​元素就会出现在顶部&#xff1a; <style>.box {position: relative;width: 50px;height: 50px;border: 3px solid;background: silver;}.…

电脑硬盘数据恢复一般需要收费多少钱

随着电子信息时代的发展&#xff0c;个人和企业对电脑硬盘中存储的数据越发重视。然而&#xff0c;由于各种原因&#xff0c;硬盘数据丢失的情况屡见不鲜。如果您正陷入这样的困境&#xff0c;您可能会好奇恢复失去的数据需要花费多少钱。本文将为您介绍电脑硬盘数据恢复的一般…

数据结构前言

一、什么是数据结构&#xff1f; 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 上面是百度百科的定义&#xff0c;通俗的来讲数据结构就是数据元素集合与数据元素集合或者数据元素与数据元素之间的组成形式。 举个…

pdf文件过大如何缩小上传?pdf压缩跟我学

在我们日常工作和生活中&#xff0c;经常会遇到PDF文件过大的问题&#xff0c;给文件传输和存储带来了很大的不便。那么&#xff0c;如何缩小PDF文件大小以便上传呢&#xff1f;下面就给大家分享几个压缩方法&#xff0c;一起来了解下PDF文件压缩方法吧~ 方法一&#xff1a;嗨格…

论文阅读《Nougat:Neural Optical Understanding for Academic Documents》

摘要 科学知识主要存储在书籍和科学期刊中&#xff0c;通常以PDF的形式。然而PDF格式会导致语义信息的损失&#xff0c;特别是对于数学表达式。我们提出了Nougat&#xff0c;这是一种视觉transformer模型&#xff0c;它执行OCR任务&#xff0c;用于将科学文档处理成标记语言&a…

中国手机新进程:折叠屏出海的荣耀,5G中回归的华为

最近&#xff0c;“华为5G回归”“自研麒麟芯片回归”的消息引爆网络。网友开心庆贺之余&#xff0c;也纷纷猜测&#xff0c;华为强势归来&#xff0c;哪家友商最慌&#xff1f; “华为的回归&#xff0c;让竞争充满了更多的可能性和更多的魅力”&#xff0c;与华为渊源颇深的…

ELK框架Logstash配合Filebeats和kafka使用

ELK框架Logstash配合Filebeats和kafka使用 本文目录 ELK框架Logstash配合Filebeats和kafka使用配置文件结构input为标准输入&#xff0c;output为标准输出input为log文件output为标准输出output为es input为tcpspringboot配置logstash配置 input为filebeatsfilebeats配置logsta…

阿里云2核4G服务器5M带宽5年费用价格明细表

阿里云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G4M带宽服务器297元一年&#xff0c;2核4G云服务器ECS可以选择计算型c7、c6或通用算力型u1实例等&#xff0c;买5年可以享受3折优惠&#xff0c;阿腾云分享阿里云服务器2核4G5M带宽五年费用表&…

OPENCV实现图像查找

特征匹配+单应性矩阵 # -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/9/4 """ import cv2 import numpy as np# 读图像 img1 = cv2.imread(F:\\learnOpenCV\\openCVLearning\\pictures\\chess

容器编排工具的比较:Kubernetes、Docker Swarm、Nomad

随着容器化技术的普及&#xff0c;容器编排工具成为了现代应用部署和管理的重要组成部分。容器编排工具能够自动化容器的部署、扩展和管理&#xff0c;从而提高应用的可靠性和可伸缩性。在众多的容器编排工具中&#xff0c;Kubernetes、Docker Swarm和Nomad是三个备受关注的主要…

OpenCV(十八):图像直方图

目录 1.直方图统计 2.直方图均衡化 3.直方图匹配 1.直方图统计 直方图统计是一种用于分析图像或数据的统计方法&#xff0c;它通过统计每个数值或像素值的频率分布来了解数据的分布情况。 在OpenCV中&#xff0c;可以使用函数cv::calcHist()来计算图像的直方图。 calcHist(…

同步推送?苹果计划本月推出 iOS17和iPadOS17,你的手机支持吗?

据报道&#xff0c;苹果公司计划在本月推出 iOS 17 和 iPadOS 17 正式版更新。与去年不同的是&#xff0c;这次更新将同时发布&#xff0c;而不是分别发布。根据彭博社的一位消息人士马克・古尔曼的说法&#xff0c;苹果公司认为 iOS 17 和 iPadOS 17 的第八个测试版已经非常接…

浅谈Mysql读写分离的坑以及应对的方案 | 京东云技术团队

一、主从架构 为什么我们要进行读写分离&#xff1f;个人觉得还是业务发展到一定的规模&#xff0c;驱动技术架构的改革&#xff0c;读写分离可以减轻单台服务器的压力&#xff0c;将读请求和写请求分流到不同的服务器&#xff0c;分摊单台服务的负载&#xff0c;提高可用性&a…

Calico IP In IP模拟组网

Calico IP In IP模拟组网 网络架构 模拟组网 先在k8s-master-1节点执行如下命令&#xff1a; # 创建veth-pair设备对ip link add veth1 type veth peer name eth0# 创建ns1网络命名空间ip netns add ns1# 将eth0网卡插入ns1网络命名空间ip link set eth0 netns ns1# 为ns1网…

leetcode 第 361 场周赛

2843. 统计对称整数的数目 核心思想&#xff1a;枚举每一个数是否是对称整数,第一种写法为python写法&#xff0c;第二种为一般写法我觉得更好&#xff0c;非常有思想性。 2844. 生成特殊数字的最少操作 核心思想&#xff1a;枚举特殊数字结尾的几种可能。其实自己做的时候一…

如何在你的Android工程中启用K2编译器?

如何在你的Android工程中启用K2编译器&#xff1f; K2编译器是用于Kotlin代码编译的最新、高效编译器&#xff0c;你现在可以尝试使用了。 Kotlin编译器正在为Kotlin 2.0进行重写&#xff0c;新的编译器实现&#xff08;代号K2&#xff09;带来了显著的构建速度改进&#xff…

算法笔记 近似最近邻查找(Approximate Nearest Neighbor Search,ANN)

1 介绍 精准最近邻搜索中数据维度一般较低&#xff0c;所以会采用穷举搜索&#xff0c;即在数据库中依次计算其中样本与所查询数据之间的距离&#xff0c;抽取出所计算出来的距离最小的样本即为所要查找的最近邻。 当数据量非常大的时候&#xff0c;搜索效率急剧下降。——>…