防止HttpClient 4跟随重定向

时间:2009-08-30 02:42:36

标签: android google-app-engine apache-commons

我正在使用Apache HttpComponents库连接到我的AppEngine应用程序。为了验证我的用户身份,我需要将身份验证令牌传递给应用程序的登录地址(http://myapp.appspot.com/_ah/login?auth=..。)并从响应的标头中获取cookie。但是,登录页面以重定向状态代码响应,我不知道如何阻止HttpClient跟踪重定向,从而阻止我拦截cookie。

Fwiw,我用来发送请求的实际方法如下。

private void execute(HttpClient client, HttpRequestBase method) {
    // Set up an error handler
    BasicHttpResponse errorResponse = new BasicHttpResponse(
            new ProtocolVersion("HTTP_ERROR", 1, 1), 500, "ERROR");

    try {
        // Call HttpClient execute
        client.execute(method, this.responseHandler);
    } catch (Exception e) {
        errorResponse.setReasonPhrase(e.getMessage());
        try {
            this.responseHandler.handleResponse(errorResponse);
        } catch (Exception ex) {
            // log and/or handle
        }
    }
}

如何阻止客户端关注重定向?

感谢。

更新

根据下面的解决方案,我在创建DefaultHttpClient client之后(在将其传递给execute方法之前)执行了以下操作:

if (!this.followRedirect) {
    client.setRedirectHandler(new RedirectHandler() {
        public URI getLocationURI(HttpResponse response,
                HttpContext context) throws ProtocolException {
            return null;
        }

        public boolean isRedirectRequested(HttpResponse response,
                HttpContext context) {
            return false;
        }
    });
}

比看起来更加冗长,但并不像我想象的那么困难。

5 个答案:

答案 0 :(得分:29)

您可以使用http参数:

final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);

该方法没有javadoc,但如果查看源代码,您可以看到它设置:

HANDLE_REDIRECTS

控制:

  

定义是否应自动处理重定向

答案 1 :(得分:11)

使用HttpClient的4.3.x版直接在clientBuilder

所以当你建立你的客户使用时:

CloseableHttpClient client = clientBuilder.disableRedirectHandling().build();

我知道这是一个老问题,但我也遇到了这个问题,并希望分享我的解决方案。

答案 2 :(得分:6)

尝试使用RedirectHandler。这可能需要延长DefaultHttpClient以从createRedirectHandler()返回您的自定义实现。

答案 3 :(得分:1)

RedirectHandler似乎已被弃用,我设法通过更改DefaultHttpClient的默认RedirectionStrategy来自动禁用重定向响应:

httpClient.setRedirectStrategy(new RedirectStrategy() {
        @Override
        public boolean isRedirected(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws ProtocolException {
            return false;
        }

        @Override
        public HttpUriRequest getRedirect(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws ProtocolException {
            return null;
        }
    });

在缺点方面,这将我们与HttpClient的特定实现联系起来,但它确实起到了作用。

答案 4 :(得分:0)