【问题标题】:replace Location header when using .setFollowRedirect(true) with aysnchttpclient使用 aysnchttpclient 使用 .setFollowRedirect(true) 时替换 Location 标头
【发布时间】:2018-01-22 20:30:34
【问题描述】:

我想在一种情况下替换 Location 标头。我使用以下来启用重定向

client.prepareGet(request.getUrl())
             .setFollowRedirect(true)

我所做的是扩展 AsyncCompletionHandler 类,然后我从那里@Override onHeadersReceived(),

@Override
public State onHeadersReceived(final HttpResponseHeaders headers) throws Exception {

String location = headers.getHeaders().get("Location").replace("itmss", "https"
);
DefaultHttpHeaders httpHeaders = new DefaultHttpHeaders();
httpHeaders.add(HEADER, location);
httpHeaders.add(headers.getHeaders());
return inner.onHeadersReceived(new HttpResponseHeaders(httpHeaders));

}

但是,我看到请求仍然使用itms 而不是https,这意味着Location 标头没有被替换。

目前的计划是实现一个在Redirect30xInterceptor.java(https://github.com/AsyncHttpClient/async-http-client/blob/dd459294434a408cff3c65c9f5c402b82d60aaa2/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java)之前运行的拦截器,并改变url。

另外一个方案是对下面的代码做一个while循环,每当收到3XX,在下一个请求中设置一个新的url。

client.prepareGet(request.getUrl())
                             .addHeader("User-Agent", request.getUserAgent())
                             .setProxyServer(proxyServer)
                             .execute(new ResponseAsyncCompletionHandler(request))
                             .toCompletableFuture();

最终目的是将itms://替换为https://,所以下一个请求使用https而不是itms

【问题讨论】:

    标签: java asynchttpclient


    【解决方案1】:

    深入研究,okhttp 很容易支持拦截器。

    如果想使用 AsyncHttp,那就更棘手了。您必须实现 ResposeFilter,然后从那里更改请求,并设置 replayRequest(true),这意味着发出了一个新请求。

    示例代码

    builder.request(new RequestBuilder(nextRequest).build()).replayRequest(true);

    https://github.com/AsyncHttpClient/async-http-client/blob/master/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ResponseFiltersInterceptor.java#L62

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多