如何用HttpClient5 AsyncHttpClient在重定向时转发敏感请求头?
Spring WebClient(底层HttpAsyncClient)重定向配置及敏感头转发问题解决
问题背景
我在使用底层基于org.apache.hc.client5.http.impl.async.HttpAsyncClient的Spring WebClient处理重定向时,需要在重定向请求中转发敏感请求头。之前旧版本的API里可以通过.followRedirect(boolean followRedirect, Consumer<HttpClientRequest> redirectRequestConsumer)方法配置重定向时的请求处理,但当前版本已经移除了这个方法。
我曾用过一种临时方案:关闭自动重定向,从重定向响应里提取请求头和Cookie,再手动发送包含这些信息的第二次请求,但这只是权宜之计,并非合理的解决方案。
可行解决方案
通过直接配置HttpAsyncClient的请求参数,再将其作为连接器注入WebClient,即可实现重定向控制。如果需要自定义重定向时的敏感头转发,还可以扩展HttpAsyncClient的RedirectStrategy实现更精细的控制。
基础重定向开关配置代码
public static WebClient create(final boolean followRedirects) { final HttpAsyncClientBuilder clientBuilder = HttpAsyncClientBuilder.create(); final RequestConfig requestConfig = RequestConfig.custom().setRedirectsEnabled(followRedirects).build(); clientBuilder.setDefaultRequestConfig(requestConfig); final ClientHttpConnector connector = new HttpComponentsClientHttpConnector(clientBuilder.build()); return WebClient.builder().clientConnector(connector).build(); }
扩展敏感头转发(可选)
如果需要在重定向时保留特定敏感头,可以自定义RedirectStrategy,示例如下:
public class CustomRedirectStrategy extends DefaultRedirectStrategy { @Override public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { HttpUriRequest redirectRequest = super.getRedirect(request, response, context); // 添加需要转发的敏感头,比如Authorization Header authHeader = request.getFirstHeader("Authorization"); if (authHeader != null) { redirectRequest.addHeader(authHeader); } return redirectRequest; } }
然后在构建HttpAsyncClient时设置该策略:
clientBuilder.setRedirectStrategy(new CustomRedirectStrategy());
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

