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

举报
bug菌 发表于 2025/08/25 15:33:50 2025/08/25
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 前言 🎉随着前后端分离架构的普及,跨域请求(CORS,Cross-O...

🏆本文收录于「滚雪球学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的安全性,我们需要遵循一些最佳实践,避免出现潜在的安全隐患。

🚀 安全性注意事项:

  1. 限制允许的域名:不要使用*(允许所有域名),应该只允许信任的域名进行跨域请求,避免恶意网站滥用接口。

  2. 控制允许的HTTP方法和请求头:只允许特定的HTTP方法(如GET, POST等)和请求头,以减少潜在的攻击面。

  3. 设置allowCredentialsfalse(如果不需要):在不需要跨域认证的场景下,可以设置allowCredentials = false,防止浏览器自动发送用户的凭证(如Cookies)。

  4. 使用maxAge优化性能:对于CORS预检请求,可以设置maxAge参数,避免浏览器频繁地发送预检请求。

  5. 避免暴露敏感信息:确保跨域请求返回的错误信息不暴露服务器的敏感信息,避免泄露系统内的错误栈、数据库信息等。

💡 总结

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-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。