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

响应式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:12:22