Spring Boot CORS配置问题:特定域名放行+指定端点允许任意源失效
问题原因
你的问题源于两个关键点:
- 全局CORS配置的
/**匹配优先级高于@CrossOrigin注解,导致端点的局部配置被全局规则覆盖; - 全局配置中
allowCredentials(true)与@CrossOrigin(origins="*")存在冲突——浏览器规范明确禁止同时设置Access-Control-Allow-Credentials: true和Access-Control-Allow-Origin: *,这是请求被拦截的核心原因。
正确配置方案
1. 调整全局CORS配置,排除目标端点
修改全局配置,让它仅作用于除/data外的所有接口,释放/data的局部配置权限:
@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 排除/data端点,不应用全局规则 .excludePathPatterns("/data") .allowedOrigins("https://example.com", "https://example2.com") .allowedMethods("*") .allowedHeaders("*") .exposedHeaders("Authorization", "Cache-Control", "Content-Language", "Content-Type", "Expires", "Last-Modified", "Pragma") .allowCredentials(true) .maxAge(3600); }
2. 修正端点的@CrossOrigin配置
如果/data不需要接收凭证(如Cookie、HTTP认证信息),直接使用如下配置即可实现任意源访问:
@GetMapping("/data") @CrossOrigin(origins = "*", allowedMethods = "*", allowedHeaders = "*") public ResponseEntity<String> getData() { return ResponseEntity.ok("Some data"); }
注意:若
/data必须支持凭证访问,则不能使用*作为源,需通过动态获取请求源的方式处理,但这不符合你“允许任意源”的需求,因此推荐上述无凭证的配置方案。
最终效果
- 除
/data外的所有接口:仅允许https://example.com、https://example2.com带凭证访问; /data接口:允许任意源无凭证访问,且不会被全局规则拦截。
内容的提问来源于stack exchange,提问作者felip gonzalez
相关产品推荐
相关产品推荐

