Spring Boot中CORS配置无效求助:PUT请求跨域被拦截
解决Spring Boot中PUT请求的CORS异常问题
问题说明
当前报错:
从源 'http://localhost:4200' 访问 'http://localhost:8080/v1/employees/' 的XMLHttpRequest被CORS策略阻止:预检响应中的Access-Control-Allow-Methods不允许使用PUT方法。
核心原因分析
问题出在多套CORS配置冲突,以及部分配置违反浏览器跨域规则:
- 全局CORS配置中重复调用
allowedMethods,先指定具体方法后又设置*,冗余配置易引发规则混乱。 - 拦截器中手动设置
Access-Control-Allow-Origin: *,与全局配置的allowCredentials(true)冲突——浏览器明确规定,当开启跨域凭证支持时,Access-Control-Allow-Origin必须是具体源,不能用通配符*,这会导致浏览器忽略正确的CORS响应头。 - 同时使用
@CrossOrigin注解、全局CORS配置、拦截器手动设置响应头,三套规则互相干扰,最终导致预检请求的响应头不符合要求。
解决方案
1. 清理冗余配置,保留一套规则
直接移除控制器上的@CrossOrigin注解,以及拦截器中手动添加的跨域响应头代码,仅保留全局CORS配置,避免多规则冲突。
2. 修正全局CORS配置
修复重复的allowedMethods调用,确保配置符合带凭证跨域的规则:
@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:4200") // 明确指定源,配合凭证支持 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 直接指定允许的方法 .maxAge(3600L) .allowedHeaders("*") .exposedHeaders("Authorization") .allowCredentials(true); }
3. 确保OPTIONS预检请求正常放行
如果自定义了拦截器,需添加判断逻辑,直接放行OPTIONS请求,避免拦截器阻断预检流程:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); return true; } // 其他拦截逻辑 return super.preHandle(request, response, handler); }
4. 验证配置有效性
重启应用后,通过浏览器开发者工具查看OPTIONS预检请求的响应头,确认:
Access-Control-Allow-Origin值为http://localhost:4200Access-Control-Allow-Methods包含PUTAccess-Control-Allow-Credentials为true
内容的提问来源于stack exchange,提问作者George Vardikos
相关产品推荐
相关产品推荐

