Spring Boot中/v1路径CORS错误及404异常排查求助
问题分析与解决方案
先拆解你的两个核心问题,结合错误日志和配置逐一分析:
问题1:根路径/v1/的CORS错误
从你更新的错误信息Redirect is not allowed for a preflight request可以明确原因:
当浏览器访问http://192.168.0.3/v1/时,Spring Boot默认会对末尾带斜杠的路径做重定向(比如把/v1/重定向到/v1),但CORS的预检OPTIONS请求是不允许被重定向的,浏览器因此拦截了响应。
而/v1/signup能正常访问,是因为这个路径有明确的Controller映射,不会触发重定向,预检请求能被正常处理。
解决方案
方案A:禁用末尾斜杠重定向
在application.properties/application.yml中添加配置,关闭Spring Boot的自动重定向行为:
# Spring Boot 2.6+适用,指定路径匹配策略 spring.mvc.pathmatch.matching-strategy=PATH_PATTERN_PARSER # 禁用末尾斜杠重定向 spring.mvc.redirect-to-non-slash=false
方案B:给根路径添加Controller映射
创建一个控制器处理/v1和/v1/的请求,避免触发重定向:
@RestController @RequestMapping("/v1") public class RootApiController { // 同时匹配带斜杠和不带斜杠的根路径 @GetMapping(value = {"", "/"}) public ResponseEntity<String> getApiStatus() { return ResponseEntity.ok("V1 API is running"); } }
问题2:Postman访问根路径的404/401异常
这个问题和重定向直接相关:
- 凭证错误时:Spring Security的HttpBasic认证会直接拦截请求返回401,不会走到DispatcherServlet找控制器的步骤,所以不会出现404。
- 凭证正确时:认证通过后,DispatcherServlet找不到
GET /v1/的控制器映射,返回404;而你说发送POST却显示GET,是因为重定向会自动把POST请求转为GET请求,导致日志显示异常。
解决这个问题只需要执行上面的方案A或B即可,根路径有了正确的映射后,无论凭证是否正确,都会按照预期返回结果。
额外的CORS配置隐患
你的CorsConfig中有一个不符合浏览器规范的配置:当设置config.setAllowCredentials(true);时,config.addAllowedOrigin("*");是无效的——浏览器不允许同时开启凭证支持和通配符域名。你需要把允许的源改为前端实际的域名:
@Configuration public class CorsConfig { @Bean public FilterRegistrationBean<Filter> customCorsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 替换为你的前端实际域名,比如你的localhost:3007 config.addAllowedOrigin("http://localhost:3007"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); // 缓存预检请求结果,减少OPTIONS请求次数 config.setMaxAge(3600L); source.registerCorsConfiguration("/**", config); FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>(new CorsFilter(source)); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; } }
最终验证步骤
- 先修复CORS的域名配置,替换为前端实际地址。
- 选择方案A或B解决根路径重定向问题。
- 测试浏览器访问
/v1:此时预检请求不会被重定向,CORS错误消失;认证通过后会返回控制器的响应,认证失败返回401。
内容的提问来源于stack exchange,提问作者The Coder
相关产品推荐
相关产品推荐

