You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中CORS配置无效求助:PUT请求跨域被拦截

解决Spring Boot中PUT请求的CORS异常问题

问题说明

当前报错:

从源 'http://localhost:4200' 访问 'http://localhost:8080/v1/employees/' 的XMLHttpRequest被CORS策略阻止:预检响应中的Access-Control-Allow-Methods不允许使用PUT方法。

核心原因分析

问题出在多套CORS配置冲突,以及部分配置违反浏览器跨域规则:

  1. 全局CORS配置中重复调用allowedMethods,先指定具体方法后又设置*,冗余配置易引发规则混乱。
  2. 拦截器中手动设置Access-Control-Allow-Origin: *,与全局配置的allowCredentials(true)冲突——浏览器明确规定,当开启跨域凭证支持时,Access-Control-Allow-Origin必须是具体源,不能用通配符*,这会导致浏览器忽略正确的CORS响应头。
  3. 同时使用@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:4200
  • Access-Control-Allow-Methods包含PUT
  • Access-Control-Allow-Credentials为true

内容的提问来源于stack exchange,提问作者George Vardikos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:31:09