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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:40:26