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

一、问题

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

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

二、为什么

仔细查看错误提示信息: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 {

    @Override
    public 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 {

    @Override
    public 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 {

    @Override
    public 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: 3600
            allowed-origin-patterns: "https://*.example.com"
            allowed-headers: "*"
            allow-credentials: true
            allowed-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;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }

}

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

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

相关文章

单元测试,一直转圈,既不报错也不运行结束(ssm junit4 test )

修改dataSource.properties文件 然后把mysql.version的版本修改为8.x.x 如果没有效果,再看看连接数据库的用户名和密码是否正确,一般是连接数据库出了错,单元测试才回一直转圈,我是检查了一上午才发现,用户名错了。 检…

性能测试 —— Jmeter日志查看与分析

一、Jmeter日志概览 Jmeter日志文件保存在bin目录中,名称为jmeter.log。我们可以在面板中直接察看日志,点击右上角黄色标志物可以打开日志面板,再次点击收起 另外,Jmeter可以很方便地设置日志输出级别: 通过这种方式修…

工业制造业怎样进行进行智能、高效的机台文件管控?

对于工业制造业而言,机台是极为关键的基础设施,是正常生产经营的前提。工业制造业的机台包括很多种类,数控机床、防静电工作台、旋转工作台、机床工作台、车床等。 工业制造业机台产生的文件类型也有很多种类,如: 工艺…

NUC 14 Pro+:超越想象,夏日必备神机

夏日最让打工人意难平的大概是呼呼作响的主机风扇,即使在凉爽的空调房中,轰响的主机也让人心浮气躁。要怎样才能与它和平共处?它怎么就不明白,安安静静的陪伴真的很重要! 这时候NUC 14 Pro 就是你最佳的伙伴 &#xff…

【专业性强】地球科学SCI期刊,中科院2区,学术影响力大

一、期刊名称 GIScience & Remote Sensing 二、期刊简介概况 期刊类型:SCI 学科领域:地球科学 影响因子:6.7 中科院分区:2区 三、期刊征稿范围 GIScience & Remote Sensing是一本完全开放获取的期刊,发表…

音视频开发30 FFmpeg 视频编码- 流程以及重要API,H264编码原理说明,该章节使用h264编码说明

一.H264编码原理 1 视频为什么需要进行编码压缩 ◼ 一张为 720x480 的图像,用 YUV420P 的格式来表示,其大小为: 720*480*1.5 约等于 0.5MB 。 ◼ 如果是 25 帧, 10 分钟的数据量 0.5M*10*60*25 7500MB -> 7GB 多 ◼ …

RestTemplate修改默认转换器,使用FastJsonConverter

问题描述: 在使用RestTemplate发送POST请求时,发现发送的数据并未按配置的JSONField转换,导致服务方一直收不到参数 排查过程: 将itemList改成Items传输即可 原因分析: RestTemplate有默认的转换器,所以…

引入基于图的增强框架实现大模型的可控文本生成

尽管LLMs能够生成丰富多样的文本,但它们在生成特定属性文本时仍面临挑战。例如,如何确保生成的文本不仅语言流畅、语义准确,同时还具有所需的情感色彩或避免包含不当内容,是一个亟待解决的问题。传统的可控文本生成(CT…

2. jenkins发布java项目

jenkins发布java项目 一、环境描述二、部署tomcat业务服务器三、部署git服务器,上传测试代码1、部署git服务器2、上传测试代码 四、jenkins对接组件1、安装必要的插件2、对接git客户端3、对接maven工具4、配置maven需要的jdk5、配置gitlab服务器的连接6、在jenkins上…

windows下载jdk并安装步骤(保姆级教程)

一、下载jdk 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二、双击下载好的jdk 更改安装目录然后点击下一步 然后会弹出jre的安装,需要选择路径(注意:这里的路径必须跟前面的jdk在…

如何在Java中使用Levenshtein距离实现字符串相似度匹配

在许多应用中,我们需要根据用户输入的问题找到最匹配的已知问题。Levenshtein距离(编辑距离)是一个强大的工具,可以帮助我们衡量两个字符串之间的差异,并进一步计算它们的相似度。本文将使用一个具体的例子来展示如何在…

ESXI存储设备已经分区,无法创建数据存储。

问题:ESXi 存储设备已经分区完成,并且有 VMFS 文件系统,无法创建数据存储,选项是灰色。 解决办法:通过命令行工具 在现有的 VMFS 分区上创建数据存储。 在现有的 VMFS 分区上创建数据存储 1.ESXI开SSH2.windows自带CMD登入ESXI。&…

创意学生木工工具——木工锯床

开展创意木工课程丰富了学校的课程多样性,强化了实践教育,并实现了跨学科的融合,在教育理念方面,创意木工课程强调了学生的主体地位,注重了学生的全面发展,并倡导了实践育人的理念,培养学生的综…

NGINX配置web文件服务

一、需求描述 系统需要提供文件(pdf、图片)等上传后支持预览功能。 二、实现方式 2.1 文件权限配置 chmod arwx -R public/chmod 是更改文件权限的命令。-R 是递归选项,表示更改目录及其所有子目录和文件的权限。arwx 是权限设置&#xf…

零知识学习之DPDK与RDMA(2)—— 认识DPDK(2)

接前一篇文章:零知识学习之DPDK与RDMA(1)—— 认识DPDK(1) 本文内容参考: 《Linux高性能网络详解 从DPDK、RDMA到XDP》 刘伟著 人民邮电出版社 https://blog.51cto.com/u_15301988/5181201 特此致谢&…

FineReport填报列权限控制

近期换东家啦,又回归使用帆软啦,对于填报报表列权限的控制我这边顺带记录一下 首先讲解下场景:填报报表需要不同角色决定对不同列是否有填写或者查看权限 以填写权限为例,首先考虑用到的是 帆软自带的权限编辑,其次考虑…

SQL Server2014 公司速通版

1、SQL Server 了解 SQL Server 2014是Microsoft公司推出的一款关系型数据库管理系统,它在数据库领域具有广泛的影响力和应用。 1.1 SQL Server 2014 主要特性【简单了解就行】 SQL Server 2014 引入了一系列新特性和改进,这些特性和改进旨在提高性能、增…

Charles 证书迁移/复制,实现手机安装一次证书可以连接多个设备的 charles 效果

如果你希望在一个手机上安装一次证书,但是使用这个手机可能在不同的时候去连接你自己安装了Charles的不同设备。比如你在公司有有一个电脑,你在家里也有一个电脑,甚至还有一个笔记本等。 如果想实现只给手机安装一次证书,就可以都…

基于halcon的眼在手外(Eye-to-Hand)标定

前言 上个月写了一个《基于halcon的眼在手上(Eye-in-Hand)标定》的文章,通过官方的示例代码进行了简单的叙述,想学习的小伙伴可以点击链接进行学习。之前博主认为眼在手上(Eye-in-Hand)的案例更多&#xff…

Embedding是什么?为什么重要?

本文为 Simon Willison 在 PyBay 上发表的演讲视频的文字改进版 原文链接: https://simonwillison.net/2023/Oct/23/embeddings/ 演讲视频链接: https://youtu.be/ArnMdc-ICCM Embedding 是一个非常巧妙的技术,但常常和一堆令人生畏的术…