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

Spring Boot Reactive重定向异常:跳转URL被附加到原URL问题排查

问题原因

核心问题是返回的Location头值是URL编码后的字符串,而非合法的绝对URI:

  • 你的服务返回的Location是https%3A%2F%2Fwww.test-url.com,这是对https://www.test-url.com进行URL编码后的结果
  • 浏览器和Postman会将这个编码后的字符串识别为相对路径(因为它不包含可识别的协议前缀,比如https://),因此会自动拼接到当前请求的基础URL(http://localhost:8080/redirect/)之后,形成错误的跳转地址
解决方案

1. 确认applicationLogic返回的URL格式

检查applicationLogic(param)返回的redirectUrl:

  • 如果它返回的是已经URL编码的字符串(比如https%3A%2F%2Fwww.test-url.com),需要先解码再生成URI
  • 如果它应该返回原始的未编码绝对URL(比如https://www.test-url.com),则直接使用即可

2. 修复buildRedirectResponse方法

根据applicationLogic的返回结果,调整方法实现:

情况一:返回的是编码后的URL

添加URL解码逻辑:

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

private ResponseEntity<Void> buildRedirectResponse(String redirectUrl) {
    // 解码URL编码的字符串,还原为原始绝对URL
    String decodedRedirectUrl = URLDecoder.decode(redirectUrl, StandardCharsets.UTF_8);
    return ResponseEntity
            .status(HttpStatus.MOVED_PERMANENTLY)
            .location(URI.create(decodedRedirectUrl))
            .build();
}

情况二:返回的是未编码的原始URL

确保redirectUrl是合法的绝对URL(包含协议前缀如https://),直接创建URI即可:

private ResponseEntity<Void> buildRedirectResponse(String redirectUrl) {
    // 直接使用未编码的绝对URL创建URI
    return ResponseEntity
            .status(HttpStatus.MOVED_PERMANENTLY)
            .location(URI.create(redirectUrl))
            .build();
}

3. 验证修复效果

修复后,响应头的Location应该显示为原始绝对URL:

HTTP/1.1 301 Moved Permanently
Location: https://www.test-url.com

此时浏览器和Postman会正确识别这是一个绝对URL,直接跳转至目标地址。

内容的提问来源于stack exchange,提问作者Shankar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:25:21