深入剖析 Spring Boot 3 解决跨域问题的实用方案
ztj100 2025-03-13 22:11 16 浏览 0 评论
在当今互联网大厂的软件开发流程中,Spring Boot 3 作为一款广泛应用的开发框架,其解决跨域问题的能力对于保障项目的顺利推进至关重要。随着前后端分离架构的普及,跨域请求已成为开发过程中频繁遭遇的挑战。本文将深入探讨 Spring Boot 3 解决跨域问题的多种实用方案,帮助广大互联网大厂开发人员更好地应对这一难题。
跨域问题的本质与产生原因
跨域问题源于浏览器的同源策略。所谓同源,即两个页面的协议、主机和端口号完全一致。一旦这三者中的任何一个不同,就会触发跨域问题。例如,当前端页面部署在
http://app.example.com:8080,而后端服务运行在
https://api.example.com:8443时,浏览器会阻止前端页面直接向该后端服务发起请求,因为协议、端口号以及可能存在的主机名差异均不符合同源要求。
同源策略的存在是为了保护用户的信息安全,防止恶意网站通过脚本获取其他网站的敏感数据。然而,在实际开发中,尤其是在微服务架构盛行的今天,不同服务往往部署在不同的域名、端口甚至协议下,这就不可避免地导致了跨域请求的需求。
Spring Boot 3 解决跨域问题的常见方法
使用@CrossOrigin注解
@CrossOrigin注解是 Spring 框架提供的一种便捷方式来处理跨域请求。它可以直接应用于 Controller 类或具体的请求处理方法上。
当将@CrossOrigin注解应用于 Controller 类时,该 Controller 下的所有请求处理方法都将支持跨域请求。例如:
@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "*")
public class UserController {
// 具体业务逻辑方法
}
上述代码中,@CrossOrigin(origins = "*")表示允许来自任何源的跨域请求。在实际应用中,为了安全性考虑,建议将origins属性设置为具体的允许来源,如@CrossOrigin(origins = "http://allowed-origin.com")。
若将@CrossOrigin注解应用于单个请求处理方法,则只有该方法支持跨域请求,示例如下:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
@CrossOrigin(origins = "http://specific-origin.com")
public User getUserById(@PathVariable Long id) {
// 获取用户信息逻辑
}
}
全局配置 CORS
通过创建一个配置类实现WebMvcConfigurer接口,并覆盖addCorsMappings方法,可以进行全局的 CORS(Cross-Origin Resource Sharing)配置。
以下是一个典型的全局 CORS 配置示例:
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 {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
在上述配置中:
- addMapping("/**")表示对所有请求路径都进行跨域配置。
- allowedOrigins("*")允许所有来源的请求,实际应用中应替换为具体的允许来源。
- allowedMethods指定了允许的 HTTP 请求方法。
- allowedHeaders允许所有请求头,同样在实际应用中可根据需求进行限制。
- allowCredentials(true)表示允许携带凭证(如 Cookie)。
- maxAge(3600)设置预检请求的有效期为 3600 秒。
使用 Filter 实现 CORS
通过自定义 Filter 也可以实现对跨域请求的处理。首先创建一个实现Filter接口的类,然后在该类中编写跨域处理逻辑。
示例代码如下:
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Access-Control-Allow-Origin", "*");
httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
httpResponse.setHeader("Access-Control-Allow-Headers", "*");
httpResponse.setHeader("Access-Control-Max-Age", "3600");
chain.doFilter(request, response);
}
}
上述代码中,在doFilter方法中设置了跨域相关的响应头。需要注意的是,在实际应用中,同样应将
Access-Control-Allow-Origin设置为具体的允许来源,以提高安全性。
接下来,需要将该 Filter 注册到 Spring 容器中,可通过配置类实现:
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterRegistrationConfig {
@Bean
public FilterRegistrationBean corsFilterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CorsFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
不同方法的适用场景与优缺点
@CrossOrigin注解
适用场景:适用于对个别 Controller 或方法进行跨域设置,尤其是在项目初期,对跨域需求不太明确,需要逐步调整的情况下。
优点:使用简单,灵活度高,可以针对不同的 Controller 或方法进行细粒度的跨域配置。
缺点:如果项目中有大量的 Controller 和方法需要进行跨域配置,使用该注解会导致代码冗余。同时,由于注解分散在各个 Controller 类中,不利于统一管理和维护。
全局配置 CORS
适用场景:适用于整个项目对跨域请求的规则较为统一的情况,例如前后端分离的项目,前端域名固定,后端所有接口都需要支持从该前端域名发起的跨域请求。
优点:配置集中,易于管理和维护。通过一次配置,即可对整个项目的跨域请求进行统一处理,避免了代码冗余。
缺点:灵活性相对较低,对于某些特殊的 Controller 或方法,如果需要单独设置不同的跨域规则,可能无法满足需求。
使用 Filter 实现 CORS
适用场景:适用于对跨域请求的处理逻辑有特殊需求,需要在 Filter 中进行一些额外处理的情况,例如在处理跨域请求的同时,记录请求日志等。
优点:可以在 Filter 中编写自定义的处理逻辑,满足特定的业务需求。同时,Filter 的注册和配置相对简单。
缺点:如果项目中已经存在大量的 Filter,可能会导致 Filter 链过长,影响性能。此外,由于 Filter 是基于 Servlet 规范的,与 Spring 框架的集成度不如前两种方法高。
总结
跨域问题是互联网大厂开发人员在使用 Spring Boot 3 进行开发时不可避免会遇到的挑战。通过本文介绍的@CrossOrigin注解、全局配置 CORS 以及使用 Filter 实现 CORS 等多种方法,开发人员可以根据项目的实际需求和特点,选择合适的解决方案。同时,在实际应用中,应注意安全性、性能优化和兼容性等问题,以确保项目的稳定运行。希望本文能够为广大开发人员在解决 Spring Boot 3 跨域问题时提供有益的参考和帮助。
相关推荐
- Whoosh,纯python编写轻量级搜索工具
-
引言在许多应用程序中,搜索功能是至关重要的。Whoosh是一个纯Python编写的轻量级搜索引擎库,可以帮助我们快速构建搜索功能。无论是在网站、博客还是本地应用程序中,Whoosh都能提供高效的全文搜...
- 如何用Python实现二分搜索算法(python二分法查找代码)
-
如何用Python实现二分搜索算法二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过不断缩小搜索范围,每次将问题规模减半,时间复杂度为(O...
- 路径扫描 -- dirsearch(路径查找器怎么使用)
-
外表干净是尊重别人,内心干净是尊重自己,干净,在今天这个时代,应该是一种极高的赞美和珍贵。。。----网易云热评一、软件介绍Dirsearch是一种命令行工具,可以强制获取web服务器中的目录和文件...
- 78行Python代码帮你复现微信撤回消息!
-
来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。...
- 从零开始学习 Python!2《进阶知识》 Python进阶之路
-
欢迎来到Python学习的进阶篇章!如果你说已经掌握了基础语法,那么这篇就是你开启高手之路的大门。我们将一起探讨面向对象编程...
- 白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件
-
一、背景介绍...
- Python之txt数据预定替换word预定义定位标记生成word报告(四)
-
续接Python之txt数据预定替换word预定义定位标记生成word报告(一)https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=748...
- Python——字符串和正则表达式中的反斜杠('\')问题详解
-
在本篇文章里小编给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下。在Python普通字符串中在Python中,我们用'\'来转义某些普通...
- Python re模块:正则表达式综合指南
-
Python...
- python之re模块(python re模块sub)
-
re模块一.re模块的介绍1.什么是正则表达式"定义:正则表达式是一种对字符和特殊字符操作的一种逻辑公式,从特定的字符中,用正则表达字符来过滤的逻辑。(也是一种文本模式;)2、正则表达式可以帮助我们...
- MySQL、PostgreSQL、SQL Server 数据库导入导出实操全解
-
在数字化时代,数据是关键资产,数据库的导入导出操作则是连接数据与应用场景的桥梁。以下是常见数据库导入导出的实用方法及代码,包含更多细节和特殊情况处理,助你应对各种实际场景。一、MySQL数据库...
- Zabbix监控系统系列之六:监控 mysql
-
zabbix监控mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是...
- mysql系列之一文详解Navicat工具的使用(二)
-
本章内容是系列内容的第二部分,主要介绍Navicat工具的使用。若查看第一部分请见:...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Whoosh,纯python编写轻量级搜索工具
- 如何用Python实现二分搜索算法(python二分法查找代码)
- 路径扫描 -- dirsearch(路径查找器怎么使用)
- 78行Python代码帮你复现微信撤回消息!
- 从零开始学习 Python!2《进阶知识》 Python进阶之路
- 白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件
- Python之txt数据预定替换word预定义定位标记生成word报告(四)
- 假期苦短,我用Python!这有个自动回复拜年信息的小程序
- Python——字符串和正则表达式中的反斜杠('\')问题详解
- Python re模块:正则表达式综合指南
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)