SpringBoot 3.x,跨域请求如何优雅处理(CORS)?

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言 🎉
随着前后端分离架构的普及,跨域请求(CORS,Cross-Origin Resource Sharing)成为Web开发中的一个常见问题。当浏览器的前端应用(如React、Vue)与后端API(如Spring Boot应用)部署在不同的域名、端口或协议下时,就会产生跨域请求问题。浏览器会基于同源策略(Same-Origin Policy)限制这些跨域请求,这时需要通过CORS配置来解决。
Spring Boot 3.x为开发者提供了灵活的跨域请求处理机制,帮助开发者快速配置跨域访问,确保前后端应用可以顺利通信。本篇文章将介绍CORS的概念、常见的配置方式,以及如何在Spring Boot 3.x中高效地处理跨域请求。
🌱 什么是跨域请求及其产生的原因
跨域请求的定义
跨域请求是指在浏览器中,向一个与当前页面不属于同一源(即协议、域名、端口三者之一不同)的服务器发起的HTTP请求。根据浏览器的同源策略,只有当前页面与目标服务器满足相同协议、域名、端口的条件,才能直接进行交互,否则就会发生跨域请求。
为什么会有跨域问题?
跨域问题是由于浏览器的同源策略(Same-Origin Policy)引起的。为了防止恶意网站通过JavaScript窃取用户数据,浏览器默认禁止不同源之间的访问。举个例子:
- 当前网页位于
http://example.com
,而需要访问的API位于http://api.example.com
,即使它们是同一个网站,但由于子域名不同,浏览器认为它们是不同的“源”。 - 同样的,如果前端应用通过
http://localhost:3000
请求后端http://localhost:8080
,它们的端口不同,也会导致跨域。
常见的跨域请求场景:
- 前后端分离架构:前端和后端分别部署在不同的服务器或端口上。
- API调用:前端应用需要访问外部API服务器,通常情况下这些API服务与当前页面不在同一个域。
⚙️ Spring Boot中如何配置跨域访问
在Spring Boot 3.x中,处理跨域请求非常简单,Spring提供了灵活的方式来配置跨域访问。你可以通过在Controller层使用@CrossOrigin
注解,也可以通过全局配置来处理跨域问题。
🚀 方法 1:在Controller方法中使用@CrossOrigin注解
@CrossOrigin
注解是Spring提供的一个非常简单的方式,用于在Controller方法或类上配置跨域访问。它可以精确地控制哪些API允许跨域访问,常用于前后端分离的应用中。
示例:在Controller方法中使用@CrossOrigin
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
// 允许所有域名访问该接口
@CrossOrigin
@GetMapping("/api/data")
public String getData() {
return "这是跨域请求的响应数据";
}
// 只允许特定域名访问
@CrossOrigin(origins = "http://localhost:3000")
@GetMapping("/api/specific")
public String getSpecificData() {
return "这是特定域名的跨域响应数据";
}
}
在这个例子中:
@CrossOrigin
默认允许所有域名访问。@CrossOrigin(origins = "http://localhost:3000")
只允许来自http://localhost:3000
的请求跨域访问该接口。
通过@CrossOrigin
,你可以灵活地控制跨域请求的来源、方法、头部等信息。
其他常用配置:
- methods:指定允许的HTTP方法,如
GET
,POST
,PUT
,DELETE
等。 - allowedHeaders:指定允许的请求头。
- allowCredentials:指定是否允许客户端发送凭证,如Cookies。
@CrossOrigin(origins = "http://localhost:3000", methods = {RequestMethod.GET, RequestMethod.POST}, allowedHeaders = "*", allowCredentials = "true")
🚀 方法 2:全局配置CORS过滤器
除了在Controller层使用@CrossOrigin
注解,我们还可以通过全局配置CORS过滤器来统一处理应用中的跨域请求。这种方式对于需要统一配置跨域规则的应用特别有用,避免了重复配置。
示例:全局配置CORS过滤器
在Spring Boot 3.x中,我们可以通过WebMvcConfigurer
接口来配置全局的CORS规则:
import org.springframework.context.annotation.Bean;
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 WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 允许所有路径进行跨域请求
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000") // 只允许指定的域名访问
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法
.allowedHeaders("*") // 允许的请求头
.allowCredentials(true) // 是否允许发送凭证
.maxAge(3600); // 预检请求的缓存时间,单位为秒
}
}
在上述配置中:
addMapping("/**")
表示所有路径都允许跨域访问。allowedOrigins("http://localhost:3000")
限制只允许http://localhost:3000
的跨域请求。allowedMethods
指定支持的HTTP方法。allowCredentials(true)
表示允许浏览器发送Cookies。maxAge(3600)
设置预检请求的缓存时间,减少浏览器多次发起预检请求。
⚡ 使用CORS配置处理跨域安全性问题
跨域请求虽然可以解决前后端分离的问题,但也带来了一些安全性挑战。为了确保CORS的安全性,我们需要遵循一些最佳实践,避免出现潜在的安全隐患。
🚀 安全性注意事项:
-
限制允许的域名:不要使用
*
(允许所有域名),应该只允许信任的域名进行跨域请求,避免恶意网站滥用接口。 -
控制允许的HTTP方法和请求头:只允许特定的HTTP方法(如
GET
,POST
等)和请求头,以减少潜在的攻击面。 -
设置
allowCredentials
为false
(如果不需要):在不需要跨域认证的场景下,可以设置allowCredentials = false
,防止浏览器自动发送用户的凭证(如Cookies)。 -
使用
maxAge
优化性能:对于CORS预检请求,可以设置maxAge
参数,避免浏览器频繁地发送预检请求。 -
避免暴露敏感信息:确保跨域请求返回的错误信息不暴露服务器的敏感信息,避免泄露系统内的错误栈、数据库信息等。
💡 总结
Spring Boot 3.x提供了非常强大的跨域请求处理支持,使得开发者可以轻松配置前后端分离应用中的跨域问题。通过使用@CrossOrigin
注解和全局CORS配置,我们可以灵活地控制跨域请求的访问来源、方法、头部等信息,并解决跨域请求带来的安全性问题。
无论是使用@CrossOrigin
处理单个Controller方法的跨域,还是通过全局配置来统一管理跨域请求,Spring Boot都提供了简单高效的方式来处理跨域访问。通过合理的CORS配置,你可以确保应用的跨域请求既安全又高效。
📚 相关文章推荐:
- 🌍【Spring Boot跨域请求配置最佳实践】——掌握跨域请求配置的所有技巧!
- 🚀【前后端分离架构中的CORS处理】——解决跨域问题,提升开发效率!
- 🔐【Spring Boot安全性最佳实践】——保障CORS配置的安全性,防止跨域漏洞!
通过这些资源,你将更好地理解和应用Spring Boot中的CORS配置,打造更安全、更高效的Web应用!
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-
- 点赞
- 收藏
- 关注作者
评论(0)