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ı
相关产品推荐
相关产品推荐

