明明设置允许跨域,为什么还会出现跨域请求的问题

一、问题

在微服务项目中,明明已经设置允许跨域访问:

为什么还会出现跨域请求问题?

二、为什么

仔细查看错误提示信息:When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead.

原来当我们设置allowCredentials 参数为 true时,allowedOrigins参数将不再允许被设置为“*”参数,可以使用"allowedOriginPatterns"来替代。

那么为什么CORS要有这样的规定?allowCredentials参数又是什么鬼?

Allow-Credentials 参数在跨域资源共享(CORS)策略中用于指定是否允许浏览器发送包含凭证的请求。凭证包括 cookies、HTTP 认证信息等。当 Allow-Credentials 设置为 true 时,浏览器将允许前端应用程序在跨域请求中发送这些凭证。

在 HTTP 响应头中,Access-Control-Allow-Credentials 用于告知浏览器服务端是否允许跨域请求携带凭证。

可以看到,当我们设置Allow-Credentials 参数为true时,将会携带cookies、HTTP认证等这些比较敏感的安全信息的,因此 CORS 规范要求,当 allowCredentials 设置为 true 时,不能使用通配符 * 来表示允许所有来源(origin),而必须要明确指定允许的来源

三、怎么办

单就解决这个问题来说,我们可以有以下两个方案:

方案一:明确列出允许的来源:你可以列出具体的域名,而不是使用通配符 *。

@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("https://example.com", "https://anotherdomain.com").allowedHeaders("*").allowedMethods("*").allowCredentials(true);}}

方案二:使用 allowedOriginPatterns:从 Spring Framework 5.3 开始,支持使用 allowedOriginPatterns,它可以使用通配符并且与 allowCredentials 一起使用。

@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*") // 使用 allowedOriginPatterns 而不是 allowedOrigins.allowedHeaders("*").allowedMethods("*").allowCredentials(true);}}

四、总结

那么在Spring Boot微项目中什么情况下要设置 allowCredentials(true) 呢?

可以参考以下几个方面考虑:

1、是否需要跨域请求携带凭据:

如果你的前端应用需要通过跨域请求来访问另一个域名下的微服务,并且这些请求需要携带凭据(如 cookies、HTTP 认证信息或者客户端证书),那么你需要设置 allowCredentials(true)。
例如,如果你的前端应用和后端 API 部署在不同的域名上,并且你使用了基于 Session 或 Cookie 的身份验证机制,那么 allowCredentials(true) 是必须的。

2、安全性考虑:

在允许跨域请求携带凭据的情况下,确保你只允许受信任的来源。明确列出受信任的域名比使用 * 通配符更安全。
使用 allowedOriginPatterns 可以配合 allowCredentials(true),但也应小心配置,避免开放过多不受控的来源。

3、API 的设计方式:

如果你的微服务是无状态的,并且主要依赖于 token(如 JWT)来进行认证和授权,那么通常不需要依赖 cookies 或其他凭据机制,这种情况下可以避免使用 allowCredentials(true)。

五、推荐

        在Spring Cloud微服务项目中,前端调用一个后端API接口的请求路径通常是这样的:前端 >> 网关 >> 后端服务,即:

  • 统一由网关接收前端请求并转发后端服务
  • API通常采用token(JWT)进行认证授权

所以关于CORS跨域请求咱们可以这么处理:

1、Spring Boot后端服务

        Spring Boot后端服务不需要接收Cookie等信息,因此不用设置allowCredentials参数。

@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedHeaders("*").allowedMethods("*");}}

2、Spring Cloud Gateway网关

        网关通常需要拦截接收处理前端请求的cookie等信息,因此可以设置allowCredentials参数为true。可以在Spring Cloud Gateway的application.yml中进行如下配置:

spring:cloud:gateway:# 跨域属性配置globalcors:cors-configurations:'[/**]':max-age: 3600allowed-origin-patterns: "https://*.example.com"allowed-headers: "*"allow-credentials: trueallowed-methods:- GET- POST- DELETE- PUT- OPTION

六、提外话

        在SpringBoot中关于跨域处理的写法,在SpringFramework5.0之前通常是以继承WebMvcConfigurerAdapter方式实现的,Spring5.0之后,WebMvcConfigurerAdapter这个类已被标记为@Deprecated,不再建议使用了。

@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {private CorsConfiguration buildConfig() {CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");return corsConfiguration;}@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", buildConfig());return new CorsFilter(source);}}

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

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

相关文章

Cesium如何高性能的实现上万条道路的流光穿梭效果

大家好,我是日拱一卒的攻城师不浪,专注可视化、数字孪生、前端、nodejs、AI学习、GIS等学习沉淀,这是2024年输出的第20/100篇文章; 前言 在智慧城市的项目中,经常会碰到这样一个需求:领导要求将全市的道路…

Jenkins定时构建自动化(二):Jenkins的定时构建

目录 ​编辑 一、 jenkins定时构建语法: 1. 语法规则: 2. 常见用法举例 3. 再次举例 接上一篇:Jenkins定时构建自动化(一):Jenkins下载安装配置:Jenkins定时构建自动化(一):Jenkins下载安装配置-CSDN博客 …

常见的LED显示屏拼接优缺点解析

LED显示屏拼接技术在现代显示技术中占据了重要地位。随着市场需求的不断增长,各种拼接屏技术也不断发展,每种技术都有其独特的优势和不足。本文将详细解析常见的几种拼接屏技术,包括LED显示屏拼接、投影DLP拼接和等离子PDP拼接。 LED显示屏拼…

STM32CubeIDE提示找不到头文件(No such file or directory)的解决办法

0 前言 最近在使用STM32CubeIDE时,发现为工程添加了头文件路径,但编译的时候还是报错,提示找不到头文件: 1 解决办法 1.1 为工程添加头文件路径 右键我们的工程,然后添加头文件路径(最好是相对路径&am…

秋招突击——第八弹——Redis是怎么运作的

文章目录 引言正文Redis在内存中是怎么存储的面试重点 Redis是单线程还是多线程面试重点 内存满了怎么办?面试重点 持久化介绍面试重点 RDB持久化面试重点 AOF日志面试重点 总结 引言 差不多花了两天把redis给过了,早上也只背了一半,完成回去…

如何发现Redis热Key,有哪些解决方案?

什么是 hotkey? 如果一个 key 的访问次数比较多且明显多于其他 key 的话,那这个 key 就可以看作是 hotkey(热 Key)。例如在 Redis 实例的每秒处理请求达到 5000 次,而其中某个 key 的每秒访问量就高达 2000 次&#x…

Linux基础二

目录 一,tail查看文件尾部指令 二,date显示日期指令 三,cal查看日历指令 四,find搜索指令 五,grep 查找指令 六,> 和>> 重定向输出指令 七, | 管道指令 八,&&逻辑控…

Android开发神器:OkHttp框架源码解析

NetworkInterceptors CallServiceInterceptor 1.RealInterceptorChain.proceed() 2.EventListener.callStart()也是在RealCall.execute()嵌入到Request调用过程, EventListener.callEnd()位于StreamAllocation中调用 3.Request.Builder url (String/URL/HttpUrl) header …

Linux常用

很早以前的 ls: 查看文件夹内所有文件 rz: windows的文件传到linux服务器 sz filename: 将文件下载到windows本地 ctrlinsert:复制 shiftinsert:粘贴 ctrlD:退出spark-shell 运行脚本并输出日志 nohup sh filename.sh > log.log 2>&1 & 查看日…

STM32玩转物联网07-WIFI实验

前言 上一节我们学习了串口的简单使用,本节我们增加难度,做一个demo通过AT指令控制ESP8266,使用DMA方式接收ESP8266发来的数据,后续我们便开始通过ESP8266连接物联网云平台,敬请关注。 一、准备 1. ESP8266硬件准备 准…

在C++中,构造器(Builder)模式的思考(《C++20设计模式》及常规设计模式对比)

文章目录 一、前言二、为什么需要Builder Pattern,Builder Pattern到底解决了什么实际问题?为什么不用set()方法?2.1 初学者有那些对象的属性初始化方法呢?2.1.1 构造函数的弊端2.1.1.1 对于属性的初始化只能是固定的顺序 2.1.2 用set()函数初…

兰州理工大学24计算机考研情况,好多专业都接受调剂,只有计算机专硕不接收调剂,复试线为283分!

兰州理工大学(Lanzhou University of Technology),位于甘肃省兰州市,是甘肃省人民政府、教育部、国家国防科技工业局共建高校,甘肃省高水平大学和“一流学科”建设高校;入选国家“中西部高校基础能力建设工…

redis主从复制、哨兵、集群

在实际的生活环境中,如果只使用一个redis进行读写操作,那么面对庞大的访问人群是崩溃的,所以可以有几个redis,一个用来做主机,提供修改数据操作,而这个主机用来控制其他redis,即将更新的发送&am…

Windows程序设计课程作业-3(文件并发下载)

目录 目录 1.作业内容 2.作业要求 3.主要思路 1)窗体和组件初始化 2)下载管理器实例化 3)按钮点击事件处理 4)窗体加载事件处理 5)下载消息处理 4.主要难点 1)多线程管理: 2&#xff09…

材料科学SCI期刊,中科院3区,收稿范围广,易录用

一、期刊名称 International Journal of Material Forming 二、期刊简介概况 期刊类型:SCI 学科领域:材料科学 影响因子:2.4 中科院分区:3区 三、期刊征稿范围 该杂志发表和传播材料成型领域的原创研究。该研究应构成对材料…

理解广角镜头的视野和畸变

为什么广角镜头的视野会比长焦镜头的视野大呢? 我之前用等光程解释了景深,也解释了为什么焦距越远,成像越大,但是从来没有提到过视野范围这个概念。实际上在我之前建立的数学模型中,物曲面S是无限大的,像曲…

Chromium 调试指南2024 - 远程开发(下)

1. 引言 在《Chromium 调试指南2024 - 远程开发(上)》中,我们探讨了远程开发的基本概念、优势以及如何选择合适的远程开发模式。掌握了这些基础知识后,接下来我们将深入了解如何在远程环境中高效地进行Chromium项目的调试工作。 …

鹅算法(GOOSE Algorithm,GOOSE)求解复杂城市地形下无人机避障三维航迹规划,可以修改障碍物及起始点(Matlab代码)

一、鹅算法 鹅优化算法(GOOSE Algorithm,GOOSE)从鹅的休息和觅食行为获得灵感,当鹅听到任何奇怪的声音或动作时,它们会发出响亮的声音来唤醒群中的个体,并保证它们的安全。 参考文献 [1]Hamad R K, Rashid T A. GOO…

数据结构和算法(1) ---- Queue 的原理和实现

Queue 的定义和结构 队列(Queue) 是只允许在一端进行插入,在另一端进行删除的线性表 队列是一种先进先出(First In First Out)的线性表,简称 FIFO(First IN First OUT), 允许插入的一端称为队尾, 允许删除的一端称为队列头 队列的基本结构如下图所示&a…

FreeCAD中智能指针分析

实现原理 FreeCAD中有两套智能指针,一个是OCC的智能指针handle,另一个是自己定义的智能指针Reference,两种智能指针都是通过引用计数方式管理指针。 1.1 OCC智能指针handle OCC在基础类包中定义了一个模板类handle,该类包含一个私…