Spring Boot REST Controller重定向异常:返回200而非302问题排查
你遇到的问题核心是:当返回HttpStatus.FOUND(302)并设置相对路径的Location头时,Spring MVC会自动将请求**转发(forward)**到该路径,而非向客户端返回302重定向响应。这就是为什么客户端收到200状态码和目标路径内容的原因;而移除Location头后,Spring没有可转发的目标,就会正常返回302状态码。
可能的原因及解决方法
1. Location为相对路径导致自动转发
Spring MVC对302状态码的处理逻辑中,如果Location是相对路径(如/internal/resource),会默认将请求转发到该路径,直接返回目标资源的内容(状态码200),而非向客户端发送重定向指令。
解决方法:
确保Location设置为绝对URI(包含协议、域名/IP、端口,如https://external-site.com/resource)。修改代码中this.url的处理逻辑,保证生成的URI是绝对路径:
ResponseEntity.status(HttpStatus.FOUND) .location(URI.create(this.url!!)) // 确保url是绝对路径,如"https://xxx.com/yyy" .build()
2. 自定义过滤器/拦截器干预响应
检查项目中是否存在自定义的Filter或HandlerInterceptor,这些组件可能会拦截302响应,自动跟随Location并返回目标内容。
解决方法:
排查所有自定义拦截器/过滤器,移除或修改其中自动处理重定向的逻辑,确保302响应能正常发送到客户端。
3. Spring配置导致的行为变更
如果项目中使用了@EnableWebMvc或自定义了WebMvcConfigurer,可能修改了Spring MVC的默认重定向处理策略。
解决方法:
检查WebMvcConfigurer的配置,确保没有覆盖redirectStrategy或修改重定向相关的默认行为。如果不需要自定义配置,可移除@EnableWebMvc,使用Spring Boot的默认配置。
验证方法
可以在Controller中临时返回绝对路径的Location测试:
ResponseEntity.status(HttpStatus.FOUND) .location(URI.create("https://example.com/test")) .build()
如果此时客户端收到302状态码,说明问题确实是相对路径导致的自动转发。
内容的提问来源于stack exchange,提问作者emd

