当前位置: 首页 > news >正文

SpringBoot 跨域问题(CORS)彻底解决方案

在前后端分离项目中,跨域(CORS)是前端同学联调时最常遇到的问题,没有之一。
浏览器同源策略限制、请求被拦截、控制台报CORS error,都是典型的跨域现象。

今天我们来讲讲什么是跨域、为什么会跨域、SpringBoot 最全跨域解决方案


一、什么是跨域?为什么会出现?

1. 同源策略(浏览器安全限制)

浏览器只允许:
协议 + 域名 + 端口 完全一致,才能正常请求。

只要有一项不一样,就会触发跨域拦截:

  • http://localhost:8080

    http://localhost:9090(端口不同 → 跨域)

  • http://localhost:8080

    http://127.0.0.1:8080(域名不同 → 跨域)

  • http://localhost:8080

    https://localhost:8080(协议不同 → 跨域)

2. 跨域报错特征

  • 控制台红色错误:Access to XMLHttpRequest at... blocked by CORS policy

  • 前端请求发送失败,后端收不到请求(OPTIONS 预检请求被拦截)


二、SpringBoot 跨域 4 种解决方案

方案 1:注解方式(最简单,单个接口/Controller)

Controller 类上加一个注解:

1@RestController 2@RequestMapping("/user") 3@CrossOrigin// 允许所有跨域 4publicclassUserController{ 5}

支持精细化配置:

1@CrossOrigin( 2 origins ="http://localhost:8081",// 只允许这个前端地址 3 maxAge =3600 4)

优点:简单
缺点:只能单个Controller生效,不适合大型项目


方案 2:全局配置类

企业最常用,一次配置,全局所有接口生效。

创建CorsConfig.java

1importorg.springframework.context.annotation.Bean; 2importorg.springframework.context.annotation.Configuration; 3importorg.springframework.web.cors.CorsConfiguration; 4importorg.springframework.web.cors.UrlBasedCorsConfigurationSource; 5importorg.springframework.web.filter.CorsFilter; 6 7/** 8* 全局跨域配置 9*/ 10@Configuration 11publicclassCorsConfig{ 12 13@Bean 14publicCorsFiltercorsFilter(){ 15CorsConfiguration config =newCorsConfiguration(); 16// 1. 允许所有域名跨域(生产可指定具体地址) 17 config.addAllowedOriginPattern("*"); 18// 2. 允许所有请求头 19 config.addAllowedHeader("*"); 20// 3. 允许所有请求方法 21 config.addAllowedMethod("*"); 22// 4. 允许携带Cookie(Token、Session) 23 config.setAllowCredentials(true); 24// 5. 预检有效期 25 config.setMaxAge(3600L); 26 27UrlBasedCorsConfigurationSource source =newUrlBasedCorsConfigurationSource(); 28 source.registerCorsConfiguration("/**", config); 29returnnewCorsFilter(source); 30} 31}

✅ 复制即用,全局所有接口立刻解决跨域


方案 3:Spring Security 中的跨域配置

如果项目集成了Spring Security / Sa-Token / Shiro,必须在安全框架中开启跨域:

1@Bean 2publicSecurityFilterChainsecurityFilterChain(HttpSecurity http)throwsException{ 3 http 4.cors()// 开启跨域 5.and() 6.csrf().disable(); 7return http.build(); 8}

重点
安全框架拦截优先级最高,只配置方案2会失效!


方案 4:网关统一处理(微服务项目)

Spring Cloud / Spring Gateway 项目,必须在网关配置跨域,不要在微服务里配置。

application.yml

1spring: 2 cloud: 3 gateway: 4 globalcors: 5 cors-configurations: 6 '[/**]': 7allowedOriginPatterns:"*" 8allowedHeaders:"*" 9allowedMethods:"*" 10allowCredentials:true

三、为什么配置了还跨域?

1. 配置不生效的常见原因

  1. Spring Security / 权限框架拦截

    → 必须开启.cors()

  2. 跨域配置类未被扫描

    → 检查包路径、@Configuration

  3. 重复配置跨域

    → 多个跨域配置冲突

  4. 前端携带了自定义请求头

    → 必须允许所有头

  5. 使用了 @CrossOrigin + 全局配置冲突

2. 解决方案

直接使用方案2(全局CorsFilter)
并且权限框架中开启 cors
几乎 100% 解决所有跨域问题。


四、生产环境跨域建议

  1. 不要用 allowedOrigins("*")

    ,要指定前端域名:

1config.addAllowedOrigin("https://www.xxx.com");
  1. **允许携带Cookie时,不能用 * **

  2. 预检请求缓存时间设长一点

    (maxAge)

  3. 微服务只在网关配置跨域

五、一句话总结

  • 跨域是浏览器安全限制,后端必须开启 CORS

  • 单体项目用全局 CorsFilter(方案2)

  • 安全框架项目必须.cors()开启

  • 微服务在网关统一配置

  • 配置一次,永久告别 CORS 错误


http://www.jsqmd.com/news/552185/

相关文章:

  • rosserial_mbed_lib:面向Cortex-M的ROS轻量通信协议栈
  • MSC间充质干细胞衰老机制分析及抗衰老策略【曼博生物】
  • 本地部署音效生成器 Moodist 并实现外部访问
  • 嵌入式Linux中pthread条件变量实践指南
  • OpenClaw资源监控:nanobot性能优化基础
  • OpenClaw性能对比测试:GLM-4.7-Flash在不同硬件下的任务表现
  • 给小智AI装上“手”和“脚”:手把手教你用MCP协议扩展ESP32的语音控制能力
  • 终极解决方案:一键安装所有Visual C++运行库的完整指南
  • 【FastAPI 2.0流式AI实战权威指南】:5大生产级异步响应模式、3类LLM流式集成陷阱与性能压测实测数据(含QPS提升217%关键代码)
  • 从零构建Tree-sitter解析器:WebAssembly实战指南
  • GHelper:解放你的ROG笔记本,告别臃肿控制软件的终极解决方案
  • 消息掌控者:RevokeMsgPatcher如何突破微信消息管理边界
  • 用到-数据集 ICCV2025 | LoD-Loc v2: 低细节城市模型下的建筑轮廓对齐高鲁棒无人机定位 - MKT
  • 单片机入门指南:从零基础到项目实践
  • Python气象分析新选择:MetPy数据处理与可视化实战指南
  • SimpleIMU库详解:MPU6050嵌入式驱动与姿态解算实战
  • C++ constexpr 模板优化机制详解
  • 嵌入式定时器注册机制设计与低耦合实现
  • LaTeX Workshop终极指南:在VS Code中高效排版LaTeX文档
  • GHelper:华硕笔记本高效性能优化完整指南
  • SCMPPI:监督式对比多模态框架用于预测蛋白质间相互作用
  • 逆变器环流分析:Matlab仿真与分析报告
  • Keil调试实战:如何精准测量51单片机延时函数耗时(附晶振配置技巧)
  • 2026智慧养老系统推荐榜聚焦养老院平台建设:智慧养老服务、智慧养老院系统、智能化养老设备、最近养老院、养老管理系统选择指南 - 优质品牌商家
  • C++的std--ranges硬件优化
  • 电磁波仿真避坑指南:MATLAB中常见参数设置错误及解决方案
  • 从PaddlePaddle 2.2.2平滑升级到2.4.2的实战指南
  • 告别手动输入!SQLPlus非交互模式执行SQL脚本的3种高效方法(附实例)
  • 《失神勇者与暗杀姬》读后感:惊艳!终于又吃到一口好吃的“异世界”漫画
  • Linux磁盘管理核心命令:df、du与fdisk详解