SpringBoot:解决前后端请求跨域问题(详细教程)
文章目录
- 一、前言
- 二、解决方式
-
- 2.1 使用 @CrossOrigin 注解(简单方便,适用于单个或少量接口)
- 2.2 全局配置跨域(适用于整个项目中大量接口都需要跨域的情况)
- 2.3 使用过滤器来处理跨域(更底层的实现方式,灵活性高但代码相对复杂一点)
- 三、结语
一、前言
在前后端交互的项目中,首先要解决的就是跨域问题,这个问题是由于浏览器的同源策略导致的,这种策略是一种安全机制,它要求网页的协议、域名以及端口都完全相同,才允许一个域下的网页去访问另一个域的资源,只要这三者中有一个不同,就会产生跨域的情况。具体如下:

二、解决方式
以下是几种在 Spring Boot 中解决跨域问题的常见方式:
2.1 使用 @CrossOrigin 注解(简单方便,适用于单个或少量接口)
@CrossOrigin 注解是 Spring 框架提供的用于处理跨域请求的一种便捷方式,通过在控制器类或者具体的方法上添加该注解,来告知 Spring 允许来自特定源的跨域请求,它会在响应头中自动添加相应的跨域相关的 HTTP 头信息,从而使浏览器能正常接收跨域响应。
-
在控制类上添加注解:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping(“/api”)
@CrossOrigin(origins = “http://localhost:5173”) // 表示 http://localhost:5173 这个路径下的网页可以访问当前控制类
public class TestController {@GetMapping("/data") public String getData() {return "数据被获取到了"; }}
-
在接口上添加注解:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping(“/api”)
public class TestController {@GetMapping("/data") @CrossOrigin(origins = "http://localhost:5173") // 表示 http://localhost:5173 这个路径下的网页可以访问当前方法 public String getData() {return "数据被获取到了"; }}
注意:@CrossOrigin 注解可以不写里面的 origins 参数,不写表示可以被所有的路径访问。
2.2 全局配置跨域(适用于整个项目中大量接口都需要跨域的情况)
通过实现 WebMvcConfigurer 接口并重写 addCorsMappings 方法,在 Spring Boot 的配置类中统一设置跨域相关规则,这样就能对项目中所有符合规则的请求都自动处理跨域问题,无需在每个控制器类或者方法上单独添加注解了。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig implements WebMvcConfigurer {// 一天private static final long MAX_AGE = 24 * 60 * 60;@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 对当前路径下的所有请求都应用当前的跨域配置.allowedOrigins("*") // 允许的跨域源,可以通过逗号隔开,也可以用 * 表示允许所有源;.allowedMethods("*") // 允许的请求方法,可以指定具体的,如:"GET"、"POST"、"PUT"、"DELETE".allowedHeaders("*") // 允许的请求头类型,可以指定具体的,如:"Content-Type", "Authorization.maxAge(MAX_AGE); // 设置请求最大有效时长,在这个时长内,重复的请求就不会发送预检请求}
}
2.3 使用过滤器来处理跨域(更底层的实现方式,灵活性高但代码相对复杂一点)
通过自定义一个过滤器,在请求进入 Spring Boot 的业务逻辑处理之前拦截请求,并在响应返回给浏览器之前手动设置跨域相关的 HTTP 头信息,以此来实现跨域请求的允许。这种方式能更加灵活地根据业务需求定制跨域处理逻辑,比如可以针对不同的请求路径、请求类型等进行差异化的跨域设置。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;@Configuration
public class CorsConfig {// 1天private static final long MAX_AGE = 24 * 60 * 60;@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin("*"); // 设置访问源地址,表示所有路劲都可以访问corsConfiguration.addAllowedHeader("*"); // 设置访问源请求头,表示所有的请求头都可以corsConfiguration.addAllowedMethod("*"); // 设置访问源请求方法,表示所有的请求方法都可以corsConfiguration.setMaxAge(MAX_AGE); // 设置请求最大时长,表示在这个时长内重复的请求不会再次发送预检请求source.registerCorsConfiguration("/**", corsConfiguration); // 对当前路径下的所有请求都应用当前的跨域配置return new CorsFilter(source);}
}
三、结语
这篇文章是通过在后端来解决跨域问题的,而如果想在前端解决的话,我们一般会使用一个代理服务器来解决。首先让前端开发环境下的请求先发送到同域的代理服务器,然后由代理服务器将请求转发到真正的后端接口所在的不同域地址,对于前端来说,它感觉只是在和同域的服务器进行交互,从而绕过了浏览器的同源策略限制,实现跨域请求。
至此,本文结束,如果这篇文章对您有所帮助,希望可以点赞、收藏加关注,感谢。

相关文章:
SpringBoot:解决前后端请求跨域问题(详细教程)
文章目录 一、前言二、解决方式 2.1 使用 CrossOrigin 注解(简单方便,适用于单个或少量接口)2.2 全局配置跨域(适用于整个项目中大量接口都需要跨域的情况)2.3 使用过滤器来处理跨域(更底层的实现方式&…...
Android-V lmkd 中的那些属性值
源码基于:Android V 相关博文: Android lmkd 机制详解(一) Android lmkd 机制详解(二) Android lmkd 机制从R到T 1. 汇总 属性名说明默认值 ro.lmk.debug 启动 lmkd 的debug 模式,会打印一…...
PageHelper快速使用
依赖 <!--分页插件PageHelper--> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version> </dependency>示例 /** * 封装分页结果…...
图像处理基础(3):均值滤波器及其变种
均值滤波器可以归为低通滤波器,是一种线性滤波器,其输出为邻域模板内的像素的简单平均值,主要用于图像的模糊和降噪。 均值滤波器的概念非常的直观,使用滤波器窗口内的像素的平均灰度值代替图像中的像素值,这样的结果就…...
力扣刷题心得_JAVA
数学 > 数组 > 链表 > 字符串 > 哈希表 > 双指针 > 递归 > 栈 > 队列 > 树 //一般力扣中传入的参数和新建的对象作为返回值,都不列入空间复杂度中 //但是面试的时候要和面试官商量好,灵活定义空间复杂度 //当然最好是就在传入的对象作为返回值,(在原…...
音乐播放器实现:前端HTML,CSS,JavaScript综合大项目
音乐播放器实现:前端HTML,CSS,JavaScript综合大项目 项目概述项目视图效果一、侧边栏相关代码(一)HTML代码(二)css代码 二、登录页面(一)HTML代码(二)css代码…...
Unity编辑器缩放设置
Unity默认界面UI字体太小了,可以设置一下缩放 打开首选项, UI Scaling 设置成125%或者更大 ,然后重启...
ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT
文章目录 1.1 LLM 概述1.1.1 语言模型和NLP基础1.1.2 Transformer及在LLM中的作用1.1.3 解密 GPT 模型的标记化和预测步骤 1.2 GPT 模型简史:从 GPT-1 到 GPT-41.2.1 GPT11.2.2 GPT21.2.3 GPT-31.2.4 从 GPT-3 到 InstructGPT1.2.5 GPT-3.5、Codex 和 ChatGPT1.2.6 …...
Golang学习笔记_27——单例模式
Golang学习笔记_24——泛型 Golang学习笔记_25——协程Golang学习笔记_25——协程 Golang学习笔记_26——通道 文章目录 单例模式1. 介绍2. 应用场景3. 实现3.1 饿汉式3.2 懒汉模式 源码 单例模式 1. 介绍 单例模式是一种创建型设计模式,它确保一个类只有一个实例…...
хорошо哈拉少wordpress俄语主题
хорошо哈拉少wordpress俄语主题 wordpress俄文网站模板,推荐做俄罗斯市场的外贸公司建俄语独立站使用。 演示 https://www.jianzhanpress.com/?p7360...
[数据结构与算法]js实现二叉树
DFS 与 BFS dfs 递归 本质通过栈结构 bfs 层序遍历 通过队列结构 function permute(nums) {let res [];let cur []; // 记录当前内容let visted {}; //记录访问过的节点let len nums.length;function dfs(nth) {//递归终止条件if (nth len) {res.push([...cur]);return …...
MySQL程序之:连接到服务器的命令选项
本节介绍大多数MySQL客户端程序支持的选项,这些选项控制客户端程序如何建立与服务器的连接、连接是否加密以及连接是否压缩。这些选项可以在命令行或选项文件中给出。 连接建立的命令选项 本节介绍控制客户端程序如何建立与服务器的连接的选项。 表6.4连接建立选…...
python3GUI--仿崩坏三二次元登录页面(附下载地址) By:PyQt5
文章目录 一.前言二.预览三.实现方案1.实现原理1.PyQt52. 具体实现 2.UI设计1.UI组件化、模块化2.UI设计风格思路 3.项目代码结构4.使用方法3.代码分享1.支持跳转网页的QLabel组件2.三角形ICON按钮 四.总结 大小:33.3 …...
阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化
在直播场景中,阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力,确保直播间高并发时的流畅体验,降低了我们的运营成本,简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力,实现了数…...
Unity 学习指南与资料分享
Unity学习资料 Unity学习资料 Unity学习资料 Unity 作为一款强大的跨平台游戏开发引擎,在游戏开发及实时 3D 内容创作领域占据着重要地位。它功能丰富、易于上手,支持多平台发布,为开发者提供了广阔的创作空间。下面为你带来全面的 Unity 学…...
Android SystemUI——CarSystemBar视图解析(十一)
前面文章我们已经把 CarSystemBar 从启动到构建视图,再到将视图添加到 Window 的流程分析完毕,我们知道默认情况下在车载系统中只显示顶部栏和底部栏视图的。这里我们在前面文章的基础上以顶部栏为例具体解析其视图的结构。 一、顶部栏解析 通过《CarSystemBar车载状态栏》这…...
.NET周刊【1月第1期 2025-01-05】
国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处…...
初识go语言之指针用法
一、环境准备 安装go语言编译环境,官网地址:https://go.dev/dl/ 或者 https://golang.google.cn/dl/ 点击下载按提示安装即可 vscode 安装go语言扩展 测试 package mainimport "fmt"func main() {fmt.Println("Hello, World!") …...
用户中心项目教程(二)---umi3的使用出现的错误
目录 1.情况的说明 2.遇到的问题 1)第一个问题-关于npx的使用 2)第二个问题--unsupport问题 3)第三个收获--nodejs安装问题 4)第四个收获---nvm下载问题 5)第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…...
Android设备:Linux远程gdb调试
更多内容:XiaoJ的知识星球 目录 1.准备工作1)安装Android NDK:2)连接Android手机3)编译程序 2.启动gdbserver1)**推送gdbserver及可执行文件**:**2)启动gdbserver**:3&am…...
internlm2-chat-1.8b效果展示:输入用户语音转写文本,生成专业会议纪要模板
internlm2-chat-1.8b效果展示:输入用户语音转写文本,生成专业会议纪要模板 1. 模型效果惊艳亮相 今天要给大家展示一个特别实用的AI能力——用internlm2-chat-1.8b模型将语音转写的文字内容,自动生成专业的会议纪要模板。这个功能对于经常开…...
Windows11 Camera 存储路径自定义与系统声音录制全攻略
1. Windows11 Camera存储路径自定义详解 每次用Windows11自带的Camera应用拍完照片或视频,是不是总在C盘里翻来覆去找文件?我刚开始用的时候也经常遇到这个问题,直到发现原来存储路径可以自定义。下面我就把摸索出来的完整操作流程分享给大家…...
Windows 10/11下快速搞定Netcat安装:从下载到测试的完整指南
Windows 10/11下快速搞定Netcat安装:从下载到测试的完整指南 在Windows环境下进行网络应用开发时,经常需要测试TCP/UDP连接或模拟简单的客户端/服务器交互。虽然Linux系统自带netcat工具,但频繁切换操作系统环境会打断开发节奏。本文将手把手…...
Lua游戏AI实战:如何用ai_mgr管理多个AI组件(附完整代码解析)
Lua游戏AI实战:ai_mgr组件管理架构设计与实现精要 在游戏开发领域,AI系统的灵活性和可维护性往往决定了游戏体验的上限。当角色需要根据环境变化切换不同行为模式时,如何优雅地管理这些AI组件就成为了架构设计的核心挑战。本文将深入探讨基于…...
终极指南:如何用ArchivePasswordTestTool轻松找回遗忘的压缩包密码 [特殊字符]
终极指南:如何用ArchivePasswordTestTool轻松找回遗忘的压缩包密码 🔓 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool …...
996引擎 - [开发辅助] 利用 robocopy 同步项目 dev 文件夹
996引擎 - [开发辅助] 利用 robocopy 同步项目 dev 文件夹 代码 git 管,资源统一放内网服务器。 使用以下脚本同步 岗位 同步方向 需求 策划 本地 >>> 内网服务器 提交资源 美术 本地 >>> 内网服务器 提交资源 程序 内网服务器 >>> 本地 拉取资源 …...
OpenCore引导菜单深度解析:从单调文本到专业图形界面的进阶调优
OpenCore引导菜单深度解析:从单调文本到专业图形界面的进阶调优 【免费下载链接】OpenCore-Install-Guide Repo for the OpenCore Install Guide 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Install-Guide OpenCore作为现代黑苹果引导方案的核心…...
Lumafly:终极跨平台空洞骑士模组管理器,一键安装智能管理
Lumafly:终极跨平台空洞骑士模组管理器,一键安装智能管理 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly 你是否厌倦了空洞骑士模组安装…...
你花了几个月搭的 RAG 知识库,可能从一开始方向就错了:Karpathy 的 LLM Wiki 模式全解析
知识管理这个概念比计算机还早。 1945 年,Vannevar Bush 在《Atlantic Monthly》上发了篇文章叫《As We May Think》,提出了一个叫 Memex 的概念——一台可以装载所有书籍和记录,并能把各种材料串连起来的机器。 这大概就是"个人知识库&…...
春联生成模型-中文-base应用案例:家庭布置、店铺营销、内容创作全搞定
春联生成模型-中文-base应用案例:家庭布置、店铺营销、内容创作全搞定 1. 春联生成模型能为你做什么? 春节贴春联是中国传统文化的重要组成部分,一副好的春联既要讲究对仗工整,又要蕴含美好寓意。但对于大多数人来说,…...
