Spring MVC跨域核心是后端主动声明访问策略,关键在精准设置响应头并避开安全陷阱:推荐全局配置WebMvcConfigurer,禁用通配符origin,显式指定allowedOrigins、allowCredentials与allowedHeaders,@CrossOrigin注解按需最小化使用,注意其优先级及与Spring Security协作。

Spring MVC 处理跨域请求的核心不是“绕过浏览器限制”,而是让后端主动、明确、安全地声明谁可以访问、以什么方式访问。CORS 本身是浏览器强制执行的安全机制,正确配置的关键在于:精准控制响应头 + 避开常见安全陷阱。
全局配置 WebMvcConfigurer(推荐,兼顾安全与可维护性)
这是最主流、最可控的方式,适合中大型项目统一管理。
- 路径匹配要具体,避免开放
/**(除非确需全放开),优先用/api/**或/v1/**等业务接口前缀 - 生产环境禁用
allowedOrigins("*"),必须写死可信域名列表,例如:.allowedOrigins("https://admin.example.com", "https://app.example.com") - 若前端需传 Cookie 或 Token(如 JWT 存于 Cookie),则
allowCredentials(true)必须开启,但此时allowedOrigins*不能为 `` 或通配符**,否则浏览器直接拒绝 -
allowedHeaders建议显式列出,如"Content-Type, Authorization, X-Requested-With",避免设为"*"在部分浏览器或严格模式下失效 -
maxAge(3600)可减少 OPTIONS 预检请求频次,提升性能
@CrossOrigin 注解(按需放开,权限最小化)
适合临时对接、第三方回调或灰度接口,遵循“最小权限原则”。
- 加在方法上比加在类上更安全,只影响单个接口
- 不要写
@CrossOrigin(origins = "*"),尤其在含敏感操作(如删除、转账)的接口上 - 若需支持凭证,明确指定源并设
allowCredentials = true,例如:@CrossOrigin(origins = "https://partner-site.com", allowCredentials = "true")
- 注意:注解配置优先级高于全局配置,会覆盖后者,调试时容易误判
避开关键安全坑点
- *
allowCredentials = true+ `origins = ""` 是无效组合*:浏览器会直接拦截,报错 “The value of the 'Access-Control-Allow-Origin' header must not be the wildcard '' when the request's credentials mode is 'include'” -
Spring Security 默认拦截 OPTIONS 请求:若用了 Security,需确保 CORS 配置早于认证过滤器生效,常用做法是给配置类加
@Order(Ordered.HIGHEST_PRECEDENCE) -
预检请求(OPTIONS)必须被正确响应:全局配置和
@CrossOrigin都会自动处理;若用自定义 Filter,需手动判断request.getMethod().equals("OPTIONS")并返回 200 + 正确响应头 -
动态 Origin 判断慎用:如从数据库查白名单再设
Access-Control-Allow-Origin,虽灵活但易引入 XSS 或逻辑漏洞,非必要不建议
不复杂但容易忽略


















