springboot配置跨域问题

             近期自己搭建项目时,遇到一个跨域问题。我们以前项目解决跨域是在controller上加一个跨域注解@CrossOrigin(allowCredentials = "true"),很方便。但是在我自己搭建的项目中,启动时竟然报错了,错误如下:

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为真时,allowedorigin不能包含特殊值"*",因为不能在"访问-控制-起源“响应头中设置该值。要允许凭证到一组起源,显示地列出它们,或者考虑使用"allowedOriginPatterns”代替。

原来是以前的项目springboot是2.1,而我自己搭建的项目采用springboot2.7版本。根据错误提示,可以改成如下写法就可以了。

@CrossOrigin(allowCredentials = "true",originPatterns = "/**")

原因是在springboot2.4版本之后,不允许origins含有特殊值星号

从注解@CrossOrigin源码可以看出,origins默认是*号

通过查看源码,我认为这样写也是OK的,如:

@CrossOrigin(allowCredentials = "true",origins = "http://localhost:8010/")

到此为止跨域报错问题解决了。

其实解决跨域有两种方式,一种是利用注解,一种写个配置类。各有利弊吧,跨域注解需要在对应的controoler上加注解,配置类写一次就可以了。

第一种方式:利用注解

@CrossOrigin(allowCredentials = "true",origins = "http://localhost:8010/")
//@CrossOrigin(allowCredentials = "true",originPatterns = "/**")

这2种注解都可以

第二种方式:配置类

package com.lsl.exam.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 跨域配置WebMvcConfig
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 配置跨域
     * allowedOriginPatterns 和 allowedOrigins都是配置跨域请求来源的,
     * 前者支持通配符,后者不支持通配符,只能字符串
     * 取其一种即可
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry){
        registry.addMapping("/**")//配置当前项目哪些路径支持跨域。这是所有路径都支持跨域
//                .allowedOriginPatterns("*")//配置跨域请求来源。通配符配置方式。这是所有请求来源都可以
                .allowedOrigins("http://localhost:8010","http://www.exam.com:8010")//配置跨域请求来源,字符串配置,配置这有这2个请求来源的跨域请求访问
                .allowedMethods("GET","POST")//设置允许所有请求方式
                .allowedHeaders("*")//设置允许的header
                .allowCredentials(true)//设置是否发送cookie信息
                .maxAge(3600);
    }
}

 allowedOriginPatterns 和 allowedOrigins的区别?

     allowedOriginPatterns 和 allowedOrigins 都是用来设置允许跨域请求的来源,其中 allowedOriginPatterns 是在 Spring 5.3 版本引入的新方法,而 allowedOrigins 是旧版本中的方法。

        它们的主要区别在于使用方式和匹配规则。allowedOrigins 方法使用的是字符串匹配,即只能指定具体的跨域来源,而不能使用通配符;而 allowedOriginPatterns 方法使用的是 Ant 风格的路径匹配规则,可以使用通配符来匹配多个来源

举个例子,如果你的前端应用需要从 http://localhost:8080 和 https://www.exam.com 两个不同的来源获取数据,allowedOrigins你可以这样配置

registry.addMapping("/**")
        .allowedOrigins("http://localhost:8080", "https://www.exam.com")
        .allowedMethods("GET", "POST")
        .allowCredentials(true)
        .maxAge(3600);

        这段代码表示,允许来自 http://localhost:8080 和 https://www.exam.com 这两个来源的跨域请求访问任何请求路径,允许的 HTTP 方法包括 GET 和 POST,启用允许发送凭据,预检请求的缓存时间为 1 小时。

使用 allowedOriginPatterns 方法可以这样配置:

        

registry.addMapping("/**")
        .allowedOriginPatterns("http://localhost:*", "https://*.exam.com")
        .allowedMethods("GET", "POST")
        .allowCredentials(true)
        .maxAge(3600);

        这段代码表示,允许来自以 http://localhost: 开头的任意端口和以 https:// 开头的以 .exam.com 结尾的任意二级域名的跨域请求访问任何请求路径,允许的 HTTP 方法包括 GET 和 POST,启用允许发送凭据,预检请求的缓存时间为 1 小时。

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

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

相关文章

不会写代码也能做自动化?推荐一款自动化测试神器

在软件测试这条道路上,大部分的职业技能发展道路都会是纯业务手工测试→自动化测试→性能测试→安全测试/测试开发。 但是却有着一部分人起初进入软件测试这一行看重的就是软件测试属于IT行业,门槛比较低,不需要代码基础。 这就导致了这一部…

第07章_面向对象编程(进阶)

第07章_面向对象编程(进阶) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 关键字:this 1.1 this是什么? 在Java中,this关键字不算难理解…

<数据结构> 链表 - 单链表(c语言实现)

B.最简单结构的链表——不带哨兵位单链表的实现(关于哨兵位结点) 一、不带哨兵位单链表结点的创建1.1 typedef 链表的数据类型 1.2 结点的结构体创建 二、单链表要实现的功能 三、需要包含的头文件四、函数接口一览为什么有些函数参数传递的是二级指针&a…

【大数据之Hadoop】十一、MapReduce之Shuffle、MapTask、ReduceTask工作机制

1 Shuffle机制 对于排序而言分为两个阶段,MapTask后和ReduceTask前。 2 MapTask工作机制 MapTask并行度由切片个数决定;切片个数由切片大小(切片大小取决于块大小、maxsize(Long的最大值)和minsize(默认为…

设计模式之模板模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、模板模式是什么? 模板模式是一种行为型的软件设计模式,在父类中定义了一个模板算法,只实现…

Android---MVC/MVP/MVVM的演进

目录 一个文件打天下 一个文件--->MVC MVC--->MVP MVP--->MVVM 6大设计原则 完整demo 我们通过"#字棋"游戏来展现MVC-->MVP-->MVVM 之间的演进 一个文件打天下 数据、视图以及逻辑都放在一个 class 里面。而一个 class 里最多 500 行代码&…

GPT-4 和ChatGPT API的定价分析

OpenAI发布了他们的ChatGPT新机器学习模型GPT-4。GPT-4是GPT-3的一大进步,GPT-3是当前ChatGPT免费版本(GPT 3.5 Turbo)所运行的模型的基础,今天我们也来凑个热点,研究一下它们的定价 GPT-4新的功能 GPT-4可以在对话中使用图像,并…

Mybatis(七)Mybatis的日志体系

在介绍Mybatis日志实现前,我们先了解下java的日志体系以及日志框架的发展,目前比较常用的日志框架有下面几个: 而JCL和SLF4J属于日志接口(没有日志具体实现),提供统一的日志操作规范,而日志的实…

NumPy 秘籍中文第二版:四、将 NumPy 与世界的其他地方连接

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍以下秘籍: 使用缓冲区协议使用数组接口与 MATLAB 和 Octave 交换数据安装 RPy2与 R 交互安装 JPype将 NumPy 数组发送到 J…

什么是Lambda表达式?

什么是Lambda表达式 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。 匿名:它不像普通的方法那样有一个明确的名称&#xff1…

GPT 任务指令 = 定义角色 + 背景信息 + 任务目标 + 输出要求

GPT 任务指令 定义角色 背景信息 任务目标 输出要求 环境 GPT-4 0. 你是一名专业的导游,负责为我生成旅游计划,现在我来北京旅游,需要你为我生成一份 3天2晚的北京旅游规划。我的要求是:1.地点包括故宫、军播和环球影城。 2…

pytorch搭建ResNet50实现鸟类识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍦 参考文章地址: 365天深度学习训练营-第J1周:ResNet-50算法实战与解析 🍖 作者:K同学啊 理论知识储备 深度残差网络ResNet(dee…

OceanBase 4.1 发版 | 一个面向开发者的里程碑版本

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 2022 年 8 月,OceanBase发布了 4.0 版本(小鱼),作为业内首个单机分布式一体化架构,兼顾了分布式架构的扩展性和集中式架构的性能优势&…

优思学院|职场达人有什么晋升秘诀?

作为职场人士,升职晋升是我们一直追求的目标。然而,在职场中,竞争是激烈的,只有那些真正做到了突出表现和积极进取的人才能获得晋升机会。这里将分享七个职场达人的晋升秘诀,希望对那些正在寻找升职机会的人有所帮助。…

Linux Shell 实现一键部署Nginx

nginx前言 nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器,最初由Igor Sysoev编写。很长一段时间以来,它一直在许多负载重的俄罗斯网站上运行,包括 Yandex、 Mail.Ru、 VK和 Rambler。根据 Netcraft …

Spring的创建与Bean对象的存取

文章目录:一.Spring项目的创建1.先创建maven项目 2.添加国内源 3.添加spring依赖 4.创建spring配置文件 5.创建启动类 二.Bean对象的创建和读取1.Bean对象的创建与存储方式(1)类注解 (2)方法注解 (3&#x…

【从零开始学Skynet】基础篇(五):简易聊天室

在游戏中各玩家之间都可以进行聊天之类的交互,在这一篇中,我们就来实现一个简易的聊天室功能,这在上一篇代码的基础上很容易就能实现。1、功能需求 客户端发送一条消息,经由服务端转发,所有在线客户端都能收到&#xf…

redis网络模型

用户空间和内核空间IO五种IO模型阻塞IO非阻塞IOIO多路复用selectpollepollweb服务流程信号驱动IO异步IOIO模型比较redis网络模型redis为什么是单线程redis单线程网络模型流程用户空间和内核空间 为安全,将用户应用和系统应用分隔开,产生用户空间和内核空…

OpenTex 企业内容管理平台

OpenText 企业内容管理平台 将内容服务与领先应用程序集成,弥合内容孤岛、加快信息流并扩大治理 什么是内容服务集成? 内容服务集成通过将内容管理平台与处于流程核心的独立应用程序和系统连接起来,支持并扩展了 ECM 的传统优势。 最好的内…

Flutter Web 开发实践与优化

一,Flutter Web架构 目前,除了可以支持Android、iOS移动跨平台开发之外,Flutter还支持macOS、Windows、Linux和Web等多个跨平台的开发。可以说,作为一款先进的跨平台开发框架,Flutter已经真正意义上实现了“一次编写,处处运行”的美好愿景。 众所周知,Dart 语言存在之…