SpringBoot 如何使用 CORS 进行跨域资源共享

SpringBoot 如何使用 CORS 进行跨域资源共享

在 Web 开发中,跨域资源共享(CORS)是常见的问题之一。CORS 是一种安全机制,用于限制跨域请求对目标服务器的访问。在本文中,我们将介绍如何在 Spring Boot 中使用 CORS 进行跨域资源共享。

在这里插入图片描述

什么是 CORS?

CORS 是一种 Web 应用程序的安全机制,用于限制跨域请求对目标服务器的访问。如果一个 Web 应用程序从一个源请求资源,而该资源位于另一个源,那么跨域就发生了。CORS 机制允许服务器在响应中设置一组跨域访问控制头来告诉浏览器哪些跨域请求是允许的。

如何配置 CORS?

在 Spring Boot 中,可以通过配置 WebMvcConfigurerAdapter 来启用 CORS。以下是一个示例:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("http://localhost:8080").allowedMethods("GET", "POST").allowedHeaders("header1", "header2", "header3").exposedHeaders("header1", "header2").allowCredentials(false).maxAge(3600);}
}

在上面的示例中,我们使用 @Configuration 注解创建了一个名为 WebMvcConfig 的类,并继承了 WebMvcConfigurerAdapter 类。我们使用 addCorsMappings() 方法配置了 CORS,指定了允许跨域请求的 URL、HTTP 方法、请求头、响应头以及其他选项。

CORS 配置选项

在上面的示例中,我们使用了以下选项:

  • allowedOrigins - 允许跨域请求的 URL。
  • allowedMethods - 允许跨域请求的 HTTP 方法。
  • allowedHeaders - 允许跨域请求的请求头。
  • exposedHeaders - 允许被客户端访问的响应头。
  • allowCredentials - 是否允许发送 cookie 等凭据信息。
  • maxAge - 响应的最大缓存时间(以秒为单位)。

全局 CORS 配置

如果您希望在整个应用程序中启用 CORS,可以使用以下配置:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowedHeaders("*").exposedHeaders("header1", "header2").allowCredentials(false).maxAge(3600);}
}

在上面的示例中,我们使用 @Configuration 和 @EnableWebMvc 注解创建了一个名为 WebConfig 的类,并实现了 WebMvcConfigurer 接口。我们使用 addCorsMappings() 方法配置了全局 CORS,指定了允许跨域请求的 URL、HTTP 方法、请求头、响应头以及其他选项。

使用 Filter 配置 CORS

另一种配置 CORS 的方法是使用 Filter。以下是一个示例:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;HttpServletRequest request = (HttpServletRequest) req;response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");response.setHeader("Access-Control-Max-Age", "3600");response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {response.setStatus(HttpServletResponse.SC_OK);} else {chain.doFilter(req, res);}}
}

在上面的示例中,我们使用 @Component 注解创建了一个名为 CorsFilter 的类,并实现了 Filter 接口。我们使用 doFilter() 方法配置了 CORS,指定了允许跨域请求的 URL、HTTP 方法、请求头、响应头以及其他选项,并在 OPTIONS 方法中返回 HTTP OK 状态码。

遇到的问题及解决方案

在实际使用中,可能会遇到一些问题。以下是一些常见的问题及解决方案:

1. 配置 CORS 无效

如果您的配置不起作用,可以尝试配置 @CrossOrigin 注解。例如:

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:8080")
public class ApiController {// ...
}

在上面的示例中,我们使用 @CrossOrigin 注解配置了允许跨域请求的 URL。

2. 预检请求失败

当浏览器尝试进行跨域请求时,它将发送一个预检请求,以确定服务器是否允许跨域请求。如果预检请求失败,则跨域请求将被阻止。以下是一些可能导致预检请求失败的原因:

  • 请求头未被正确配置。如果您使用了自定义请求头,需要将它们包含在 allowedHeaders 中。
  • 请求方法未被正确配置。如果您使用了非 GET 或 POST 方法,需要将它们包含在 allowedMethods 中。
  • 响应头未被正确配置。如果您使用了自定义响应头,需要将它们包含在 exposedHeaders 中。

3. 跨域请求失败

当浏览器发送跨域请求时,它将检查服务器是否允许该跨域请求。如果服务器不允许该请求,浏览器将阻止该请求。以下是一些可能导致跨域请求失败的原因:

  • 允许跨域请求的 URL 未被正确配置。请确保将需要允许跨域请求的 URL 包含在 allowedOrigins 中。
  • 允许跨域请求的 HTTP 方法未被正确配置。请确保将需要允许跨域请求的 HTTP 方法包含在 allowedMethods 中。

结论

在本文中,我们介绍了如何在 Spring Boot 中使用 CORS 进行跨域资源共享。我们介绍了配置 CORS 的两种方法:使用 WebMvcConfigurerAdapter 和 Filter。我们还讨论了一些可能遇到的问题及其解决方案。我们希望本文能够帮助您解决在 Spring Boot 中使用 CORS 的问题。

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

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

相关文章

【Y 新闻】YMatrix 成立三周年,三岁的我们还真是“不简单”

三年的时间足够短,眨眼间我们已不知不觉度过了数个三年;但是三年的时间也足够长,这期间足够一个人完成从学校到社会的过渡,也足够一家企业实现从青涩到成熟的转变。 转眼到了 2023 年 8 月 24 日,是 YMatrix 成立后的…

中秋国庆双节邮件营销怎么做?看这里!

今年的国庆节恰逢中秋节,因此国家假日办安排国庆中秋连放8天。对于打工人来说,超长的假期是外出旅游、回家探亲好时机,可是对于企业来说,却是一次仅次于春节的营销大战。这个时候企业营销人员当然是要借助各种营销手段来获取流量和…

go语言基础操作---七

socket简单介绍—套接字编程 什么是Socket Socket,英文含义是【插座、插孔】,一般称之为套接字,用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可…

YOLO目标检测——口罩规范佩戴数据集+已标注xml和txt格式标签下载分享

实际项目应用:目标检测口罩佩戴检测数据集的应用场景涵盖了公共场所监控、疫情防控管理、安全管理与控制以及人员统计和分析等领域。这些应用场景可以帮助相关部门和机构更好地管理口罩佩戴情况,提高公共卫生和安全水平,保障人们的健康和安全…

Kubernetes 使用configmap挂载卷给Pod内的nginx容器

目录 实验:使用configmap挂载卷给Pod内的nginx容器 1、创建nginx.conf配置文件(必须由nginx镜像里的nginx.conf修改而来,防止出现配置不相似的情况出现,导致访问不了nginx网页) 2、通过nginx.conf文件创建configmap容…

【C++刷题】经典简单题第二辑

回文排列 class Solution { public:bool canPermutePalindrome(string s) {// 记录字符出现的次数int count[256] {0};for(size_t i 0; i < s.size(); i)count[s[i]];// 记录字符出现次数为奇数的个数int flag 0;for(size_t i 0; i < 256; i)if(count[i] % 2 1)f…

yolov5权重文件.pt转.bin文件

参考链接&#xff1a;YOLOv5学习记录(二): 模型转化及Android端部署_yolo .pt文件转未bin_Xiaoer__Lu的博客-CSDN博客 1、准备pt文件 我的目录是&#xff1a;C:\Users\Administrator\Desktop\driving\yolov5-mask-42-master\runs\train\exp_yolov5s\weights里的best.pt 2、p…

算法:贪心---跳一跳

1、题目&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 2…

云养殖模式:让养殖业走向智慧化、高效化、绿色化

养殖业是我国农业的重要组成部分&#xff0c;也是农民增收的重要来源。然而&#xff0c;传统的养殖方式存在着许多问题&#xff0c;如水环境污染、病害频发、市场风险高、管理落后等&#xff0c;导致养殖效益低下&#xff0c;难以适应现代消费者的需求。如何改变这种局面&#…

Java基础(二十三):反射(reflection)

文章目录 一、反射机制1.1 快速入门1.2 反射机制原理 二、反射相关类三、反射调用性能优化四、Class类4.1 基本介绍4.2 使用4.3 哪些类型有Class对象 五、类加载六、获取类的结构信息七、反射-创建实例、操作属性和方法&#xff08;爆破&#xff09; 一、反射机制 1.1 快速入门…

自然语言处理应用(三):微调BERT

微调BERT 微调&#xff08;Fine-tuning&#xff09;BERT是指在预训练的BERT模型基础上&#xff0c;使用特定领域或任务相关的数据对其进行进一步训练以适应具体任务的需求。BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种基于Tr…

【强化学习篇】on-policy 和 off-policy 的区别

本质区别&#xff1a; 要学习的 agent 跟和环境互动的 agent 是同一个&#xff0c;是on-policy(同策略) 要学习的 agent 跟和环境互动的 agent 不是同一个&#xff0c;是off-policy(异策略) on-policy 与 off-policy值函数&#xff1a; on-policy与off-policy区别是&#xf…

MCU软核 2. Xilinx Artix7上运行tinyriscv

0. 环境 - ubuntu18 - win10 vivado 2018.3 - git desktop - XC7A35TV12核心板 - ft2232hl小板&#xff08;用于程序烧录&#xff09; 1. git克隆源码 Git Desktop -> File -> Clone repository -> -> URL: https://gitee.com/liangkangnan/tinyriscv/ -> Lo…

如何在Python爬虫程序中使用HTTP代理?

在进行网络爬虫时&#xff0c;我们经常需要使用代理服务器来隐藏自己的真实IP地址&#xff0c;以避免被目标网站封禁或限制访问。本文将介绍如何将HTTP代理配置到Python爬虫程序中使用。 什么是HTTP代理&#xff1f; HTTP代理是一种网络代理&#xff0c;它充当客户端和服务器之…

Redis-带你深入学习数据类型zset

目录 1、zset有序集合 2、zset相关命令 2.1、添加或更新指定的元素——zadd 2.2、获取有序集合zset的元素个数相关命令&#xff1a;zcard、zcount 2.3、返回指定区间元素相关命令&#xff1a;zrange、arevrange、zrangebyscore 2.4、删除相关命令&#xff1a;zpopmax、zp…

$ref赋值之后,子组件不渲染(刷新后,$ref父组件传值,子组件不更新数据问题)

在父组件中&#xff0c;点击搜索&#xff0c; 通过this.$refs传值给子组件 this.$refs.GoodsClassNav.paramsAll.keyword key; 子组件结果中不显示&#xff0c; 但是打印this.$refs.GoodsClassNav.paramsAll.keyword&#xff0c;可以打印到最新的值&#xff0c;点击子组件中…

PyQt5通过堆叠布局实现选项卡(多界面)功能

PyQt5通过堆叠布局实现选项卡(多界面)功能 1、创建一个MainWindow 加入Text Brower做标题&#xff0c;几个按钮。 然后在左侧containers中添加Stacked Widget这个控件&#xff0c;初步布局如下&#xff1a; 对窗口中的堆叠容器 “Stacked Widget”&#xff0c;选中后可以用…

【100天精通Python】Day61:Python 数据分析_Pandas可视化功能:绘制饼图,箱线图,散点图,散点图矩阵,热力图,面积图等(示例+代码)

目录 1 Pandas 可视化功能 2 Pandas绘图实例 2.1 绘制线图 2.2 绘制柱状图 2.3 绘制随机散点图 2.4 绘制饼图 2.5 绘制箱线图A 2.6 绘制箱线图B 2.7 绘制散点图矩阵 2.8 绘制面积图 2.9 绘制热力图 2.10 绘制核密度估计图 1 Pandas 可视化功能 pandas是一个强大的数…

常驻巨噬细胞诱导的纤维化在胰腺炎性损伤和PDAC中具有不同的作用

介绍一篇2023年8月10日发表在Nature Immunology的文章 标题&#xff1a; Fibrosis induced by resident macrophages has divergent roles in pancreas inflammatory injury and PDAC 影响因子&#xff1a;30.5 DOI&#xff1a;https://doi.org/10.1038/s41590-023-01579-x …

web端动效 PAG

之前写过一篇lottie动效的文章&#xff1a;web端动效 lottie-web 使用&#xff0c;本篇写一下PAG-web的基础使用。 PAG是腾讯开发&#xff0c;支持移动端、桌面端以及Web端的动效工作流解决方案。目标是降低或消除动效相关的研发成本&#xff0c;能够一键将设计师在 AE&#x…