Kotlin Spring Boot全局CORS不生效报No mapping for OPTIONS /users怎么解决?
问题根因
- 你在WebConfig类上添加了
@EnableWebMvc注解,该注解会完全接管Spring MVC的配置,覆盖Spring Boot提供的默认MVC自动配置,默认的CORS预检请求(OPTIONS)处理逻辑也会随之失效。 - 控制器接口路径匹配错误,你在
@PostMapping中配置的路径为/,结合类上的@RequestMapping("users"),最终匹配的路径是/users/,如果前端调用的路径是不带末尾斜杠的/users,就会触发匹配失败的警告。 - 同时配置全局CORS和方法级的
@CrossOrigin注解可能产生配置冲突,导致配置不生效。
解决方案
方案1:调整原有配置(推荐)
- 移除WebConfig类上的
@EnableWebMvc注解,保留Spring Boot的MVC自动配置能力 - 移除控制器方法上的
@CrossOrigin注解,避免和全局CORS配置冲突 - 调整
@PostMapping的路径为"",让接口可以匹配/users路径
修改后的配置代码如下:
@Configuration class WebConfig : WebMvcConfigurer { override fun addCorsMappings(registry: CorsRegistry) { registry.addMapping("/**") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 如需携带Cookie等认证信息,需替换为前端实际部署地址,禁止同时使用*和allowCredentials=true .allowedOrigins("*") .allowedHeaders("*") // 配置预检请求缓存时长,减少重复预检请求 .maxAge(3600) } }
修改后的控制器代码如下:
@RestController @RequestMapping("users") class UserController( val userService: UserService ) { @PostMapping("", produces = ["application/json"]) fun createUser(@RequestBody user: User): User { return userService.createUser(user) } }
方案2:使用高优先级CORS过滤器
如果调整配置后仍不生效,可以直接注册CorsFilter Bean,该过滤器会在请求进入路径匹配前处理OPTIONS预检请求,优先级高于addCorsMappings配置:
@Configuration class CorsConfig { @Bean fun corsFilter(): CorsFilter { val source = UrlBasedCorsConfigurationSource() val config = CorsConfiguration() config.allowedOrigins = listOf("*") config.allowedMethods = listOf("GET", "POST", "PUT", "DELETE", "OPTIONS") config.allowedHeaders = listOf("*") config.maxAge = 3600 source.registerCorsConfiguration("/**", config) return CorsFilter(source) } }
内容的提问来源于stack exchange,提问作者SkyDriver2500
相关产品推荐
相关产品推荐

