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
相关产品推荐
相关产品推荐

