响应式WebClient配置followRedirect(true)时如何获取最终重定向URL
获取WebClient自动重定向后最终URL的方法
当你给Reactor Netty HttpClient配置followRedirect(true)开启自动重定向后,不需要手动处理3xx响应,就可以直接在响应回调里拿到最终跳转的目标URL,具体实现如下:
核心原理
Reactor Netty 1.0.12及以上版本在开启自动重定向时,会自动将最终完成请求的URL存入响应属性中,属性键为HttpClient.RESPONSE_FINAL_URL,直接从ClientResponse的属性集合中读取即可。
完整实现代码
import reactor.netty.http.client.HttpClient; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.client.WebClient; import java.net.URI; public class WebClientRedirectUrlDemo { public static void main(String[] args) { // 构建带自动重定向的WebClient实例 WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector( HttpClient.create().followRedirect(true) )) .build(); // 测试短链接请求 webClient.get() .uri("http://mz.cm/1gpgLAJ") .exchangeToMono(clientResponse -> { // 读取最终跳转URL URI finalTargetUrl = (URI) clientResponse.attribute(HttpClient.RESPONSE_FINAL_URL) .orElseThrow(() -> new RuntimeException("无法获取重定向最终地址")); System.out.println("最终跳转目标:" + finalTargetUrl); // 后续按业务需求处理响应体 return clientResponse.bodyToMono(String.class); }) .block(); } }
运行上述代码,会正确输出示例中提到的Moz博客完整目标地址。
低版本兼容方案
如果你使用的Reactor Netty版本低于1.0.12,无法直接读取内置属性,可以通过自定义重定向策略记录每一跳的地址,注意记录URL的容器要和单次请求绑定,避免线程安全问题:
WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector( HttpClient.create() .followRedirect((request, response) -> { // 自定义重定向逻辑,每次重定向时记录目标地址 URI location = response.responseHeaders().getLocation(); if (location != null) { // 将URL存入请求上下文,后续可从响应属性取出 request.currentContext().put("custom_final_url", location.resolve(request.uri())); } return HttpClient.ALLOW_REDIRECT; }) )) .build();
后续在exchangeToMono中从上下文取出对应key的值即可拿到最终URL。
注意事项
- 读取到的
RESPONSE_FINAL_URL是多级重定向后最终返回200响应的地址,完全匹配短链接跳转的最终目标 - 不要自定义响应装饰器过滤掉底层属性,否则会导致读取不到该值
- 低版本自定义重定向策略时,不要用全局变量存储URL,否则并发请求下会出现URL串扰问题
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

