HTTPClient - 捕获所有重定向的列表

时间:2011-10-22 14:21:18

标签: java apache-httpclient-4.x

是否可以使用HttpClient从URL捕获完整的重定向历史记录?

比如说我们有URL-A重定向到URL-B,它最终将我们发送到URL-C,有没有办法捕获A,B和C的URL?

最明显的选择是在标题中手动查找位置标记,并在到达HTTP 200时停止。这不是一个简单的过程,因为我们需要查找循环重定向等等...

现在我假设了以下内容:

    HttpContext context = new BasicHttpContext(); 
    HttpResponse response = hc.execute(httpget, context);
    //.....
    for(URI u :  ((RedirectLocations)context.getAttribute(DefaultRedirectStrategy.REDIRECT_LOCATIONS)).getAll()){
                System.out.println(u);
    }

适用于此用例吗?

2 个答案:

答案 0 :(得分:3)

HttpClient支持自定义RedirectHandler。您可以覆盖默认实现(DefaultRedirectHandler)以捕获所有重定向。

DefaultHttpClient hc = new DefaultHttpClient();

HttpGet httpget = new HttpGet("http://google.com");
HttpContext context = new BasicHttpContext();


hc.setRedirectHandler(new DefaultRedirectHandler() {
    @Override
    public URI getLocationURI(HttpResponse response,
                              HttpContext context) throws ProtocolException {

        //Capture the Location header here
        System.out.println(Arrays.toString(response.getHeaders("Location")));

        return super.getLocationURI(response,context);
    }
});

HttpResponse response = hc.execute(httpget, context);

答案 1 :(得分:0)

RedirectHandler从4.1开始不推荐使用 将使用RedirectStrategy

我们可以覆盖2种方法isRedirectedgetRedirect 您可以通过以下方式获得所有重定向:

final HttpClientContext clientContext = 
        HttpClientContext.adapt(context);
RedirectLocations redirectLocations = (RedirectLocations)
    clientContext.getAttribute(
        HttpClientContext.REDIRECT_LOCATIONS
    );

您可以在getRedirect中添加此代码。这也可以在getLocationURI类的DefaultRedirectStrategy方法中找到此代码。