Spring Boot跨域难题终结者:3种方案,从此告别CORS噩梦!

360影视 欧美动漫 2025-05-17 07:50 2

摘要:"前端小哥又双叒喊我联调了,浏览器疯狂报CORS错误?""明明Postman能调通,浏览器死活拦请求?""加了@CrossOrigin注解,带Cookie的请求还是被拒?"

"前端小哥又双叒喊我联调了,浏览器疯狂报CORS错误?"
"明明Postman能调通,浏览器死活拦请求?"
"加了@CrossOrigin注解,带Cookie的请求还是被拒?"

跨域问题本质是浏览器的安全策略(同源策略),与服务端无关!

核心矛盾:当前端域名(如http://localhost:3000)与后端API域名(如http://localhost:8080)不同源时,浏览器会拦截响应关键响应头:复制Access-Control-Allow-Origin: 允许的源 Access-Control-Allow-Methods: 允许的HTTP方法 Access-Control-Allow-Headers: 允许的请求头 Access-Control-Allow-Credentials: 是否允许携带凭证

记住:服务端只需正确设置这些响应头,浏览器就会放行!

适用场景:统一管理所有接口的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请求次数

适用场景:为特定Controller或方法单独配置

java

@RestController @CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true") public class UserController { @GetMapping("/user") @CrossOrigin(maxAge = 1800) // 可覆盖类级别配置 public User getUser { // ... } }

致命坑点

适用场景:项目已集成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处理(进阶话题)

后果:浏览器直接拒绝请求!
修正

java

// 错误写法 .allowedOrigins("*") .allowCredentials(true) // 正确写法 .allowedOrigins("http://your-specific-domain.com") .allowCredentials(true) 开发环境:前端配置代理(如vue.config.js的devServer.proxy)生产环境:后端配置CORS

跨域问题本质是前后端协作的信任机制——浏览器要保护用户,而开发者要明确告诉浏览器:“这个API可信!”。点赞收藏本文,下次遇到CORS问题时,你定能快速定位,一剑封喉!

来源:大龄程序猿小武

相关推荐