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

Spring Security PUT请求CORS失效,报Invalid CORS request问题排查

为什么PUT请求会触发「Invalid CORS request」错误?

这个问题的核心是Spring Boot 2.0默认的CORS配置并不包含PUT方法,而POST/GET属于CORS规范里的「简单请求」,默认被允许,PUT则需要明确配置才能通过浏览器的预检校验。

原因分析

当你在HttpSecurity中只调用http.cors()而没有自定义CorsConfigurationSource时,Spring会启用默认的CORS规则:

  • 默认允许的HTTP方法仅包含GET、HEAD、POST
  • PUT、DELETE这类属于「非简单请求」,不在默认允许列表中
  • 浏览器对非简单请求会先发送OPTIONS预检请求,若服务器未配置允许PUT方法,就会直接返回「Invalid CORS request」错误

解决方案

你有两种修复方式,推荐使用全局配置(更高效统一):

1. 全局自定义CORS配置

创建CorsConfigurationSource类型的Bean,明确包含PUT方法的权限:

@Bean
public CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration config = new CorsConfiguration();
    // 生产环境建议替换为具体前端域名,不要用*
    config.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
    // 必须包含OPTIONS(预检请求),同时加入PUT方法
    config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
    // 允许所有请求头,若有自定义头可单独指定
    config.setAllowedHeaders(Arrays.asList("*"));
    // 若需要携带Cookie或认证信息,开启此项
    config.setAllowCredentials(true);
    
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    // 对所有接口生效
    source.registerCorsConfiguration("/**", config);
    return source;
}

然后在HttpSecurity配置中指定这个自定义的配置源:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().configurationSource(corsConfigurationSource()) // 替换默认CORS配置
            .and().csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
            .antMatchers("/h2-console/**/**").permitAll()
            // 其他权限配置...
}

2. 单个接口局部配置

如果仅需给某个PUT接口开启CORS,可以在控制器方法上添加@CrossOrigin注解:

@CrossOrigin(allowedMethods = {"GET", "POST", "PUT"})
@PutMapping("/your-api-endpoint")
public ResponseEntity<?> updateResource(@RequestBody YourRequestDto dto) {
    // 业务逻辑处理
    return ResponseEntity.ok().build();
}

额外注意事项

  • 若前端请求携带了自定义请求头,需要在setAllowedHeaders中明确指定这些头信息
  • 生产环境禁止使用setAllowedOrigins(Arrays.asList("*")),必须指定具体的前端域名,避免安全风险

内容的提问来源于stack exchange,提问作者Samet Baskıcı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:20:26