网站首页 > 技术文章 正文
"前端小哥又双叒喊我联调了,浏览器疯狂报CORS错误?"
"明明Postman能调通,浏览器死活拦请求?"
"加了@CrossOrigin注解,带Cookie的请求还是被拒?"
如果你也曾在Spring Boot跨域问题上反复踩坑,这篇文章将用最硬核的解决方案+底层原理解析,一次性扫清所有障碍!文末附自测Checklist和常见作死操作,建议收藏!
一、先搞懂本质:为什么浏览器要拦你?
跨域问题本质是浏览器的安全策略(同源策略),与服务端无关!
- 核心矛盾:当前端域名(如http://localhost:3000)与后端API域名(如http://localhost:8080)不同源时,浏览器会拦截响应
- 关键响应头:
- 复制
- 下载
- Access-Control-Allow-Origin: 允许的源 Access-Control-Allow-Methods: 允许的HTTP方法 Access-Control-Allow-Headers: 允许的请求头 Access-Control-Allow-Credentials: 是否允许携带凭证
记住:服务端只需正确设置这些响应头,浏览器就会放行!
二、Spring Boot解决跨域的3种方案(附代码+避坑指南)
方案1:全局配置(推荐生产环境使用)
适用场景:统一管理所有接口的CORS规则
java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000", "https://your-prod-domain.com")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
避坑指南:
- 若启用allowCredentials(true),allowedOrigins不能为通配符*,必须明确指定域名!
- maxAge设置预检请求缓存时间,减少OPTIONS请求次数
方案2:注解驱动(灵活但易遗漏)
适用场景:为特定Controller或方法单独配置
java
@RestController
@CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true")
public class UserController {
@GetMapping("/user")
@CrossOrigin(maxAge = 1800) // 可覆盖类级别配置
public User getUser() {
// ...
}
}
致命坑点:
- 类和方法同时使用@CrossOrigin时,属性会合并而非覆盖(如methods取并集)
- 若全局配置和注解共存,注解优先级更高
方案3:Spring Security整合(最易翻车)
适用场景:项目已集成Spring Security
java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors() // 启用CORS配置
.and()
.csrf().disable(); // 根据业务决定是否关闭CSRF
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
configuration.setAllowedMethods(Arrays.asList("*"));
configuration.setAllowedHeaders(Arrays.asList("*"));
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
血泪教训:
- 必须同时启用.cors()和定义CorsConfigurationSource Bean
- 如果保留CSRF保护,需配合withCsrfToken处理(进阶话题)
三、高频深坑:这些错误操作你中招了吗?
1. 陷阱:Nginx配置了CORS,后端又配一次导致冲突
现象:响应头中出现重复的
Access-Control-Allow-Origin
解决方案:保持单一配置层,不要重复设置!
2. 陷阱:用了通配符*还开allowCredentials
后果:浏览器直接拒绝请求!
修正:
java
// 错误写法
.allowedOrigins("*")
.allowCredentials(true)
// 正确写法
.allowedOrigins("http://your-specific-domain.com")
.allowCredentials(true)
3. 陷阱:忘记处理OPTIONS预检请求
现象:POST请求被拦截,控制台提示缺少CORS头
真相:复杂请求(如Content-Type=application/json)会先发OPTIONS请求探路
应对:确保Spring Boot正确处理OPTIONS方法(全局配置已包含)
4. 陷阱:Vue等前端框架的代理配置混淆
典型错误:开发环境同时配了前端代理和后端CORS,导致逻辑混乱
最佳实践:
- 开发环境:前端配置代理(如vue.config.js的devServer.proxy)
- 生产环境:后端配置CORS
四、自测Checklist:你的跨域配置真的生效了吗?
- 打开浏览器开发者工具 → Network选项卡
- 查看响应头是否包含Access-Control-Allow-Origin
- 携带Cookie的请求检查Access-Control-Allow-Credentials: true
- 复杂请求观察是否有OPTIONS预检请求,并返回204状态码
结语
跨域问题本质是前后端协作的信任机制——浏览器要保护用户,而开发者要明确告诉浏览器:“这个API可信!”。点赞收藏本文,下次遇到CORS问题时,你定能快速定位,一剑封喉!
- 上一篇: 京东大佬问我,SpringBoot为什么会出现跨域问题?如何解决?
- 下一篇:已经是最后一篇了
猜你喜欢
- 2025-06-03 京东大佬问我,SpringBoot为什么会出现跨域问题?如何解决?
- 2025-06-03 在 Spring Boot3 中轻松解决接口跨域访问问题
- 2025-06-03 最常见五种跨域解决方案(常见跨域及其解决方案)
- 2025-06-03 Java Web开发中优雅应对跨域问题(java跨域问题解决办法)
- 2025-06-03 Spring Boot解决跨域最全指南:从入门到放弃?不,到根治!
- 2025-06-03 Spring Boot跨域问题终极解决方案:3种方案彻底告别CORS错误
- 2025-06-03 Spring Cloud 轻松解决跨域,别再乱用了
- 2024-09-27 ASP.NET实战007:MVC解决跨域请求问题详解
- 2024-09-27 一文带你彻底搞懂跨域那些事(不只会用)
- 2024-09-27 程序员如何处理跨域问题,记住这一点就够了
你 发表评论:
欢迎- 489℃几个Oracle空值处理函数 oracle处理null值的函数
- 485℃Oracle分析函数之Lag和Lead()使用
- 483℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 469℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 464℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 458℃【数据统计分析】详解Oracle分组函数之CUBE
- 442℃Oracle有哪些常见的函数? oracle中常用的函数
- 436℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 最近发表
-
- Spring Boot跨域难题终结者:3种方案,从此告别CORS噩梦!
- 京东大佬问我,SpringBoot为什么会出现跨域问题?如何解决?
- 在 Spring Boot3 中轻松解决接口跨域访问问题
- 最常见五种跨域解决方案(常见跨域及其解决方案)
- Java Web开发中优雅应对跨域问题(java跨域问题解决办法)
- Spring Boot解决跨域最全指南:从入门到放弃?不,到根治!
- Spring Boot跨域问题终极解决方案:3种方案彻底告别CORS错误
- Spring Cloud 轻松解决跨域,别再乱用了
- Github 太狠了,居然把 "master" 干掉了
- IntelliJ IDEA 调试 Java 8,实在太香了
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)