Предотвращение HttpClient 4 от следующего перенаправления - PullRequest
20 голосов
/ 30 августа 2009

Я подключаюсь к своему приложению AppEngine с помощью библиотеки Apache HttpComponents. Чтобы аутентифицировать своих пользователей, мне нужно передать токен аутентификации по адресу регистрации приложения (http://myapp.appspot.com/_ah/login?auth=...)) и извлечь cookie из заголовка ответа. Однако страница входа в систему отвечает кодом состояния перенаправления и я не знаю, как помешать HttpClient выполнить перенаправление, что помешало мне перехватить cookie.

Кстати, фактический метод, который я использую для отправки запроса, приведен ниже.

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 ]

29 голосов
/ 09 ноября 2009

Вы можете сделать это с помощью http-параметров:

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

Метод не имеет Javadoc, но если вы посмотрите на источник, вы увидите, что он устанавливает:

HANDLE_REDIRECTS

который контролирует:

Определяет, должны ли перенаправления обрабатываться автоматически

11 голосов
/ 27 августа 2014

С версией 4.3.x HttpClient непосредственно в clientBuilder .

поэтому, когда вы строите свой клиент, используйте:

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

Я знаю, что это старый вопрос, но у меня тоже была эта проблема, и я хочу поделиться своим решением.

6 голосов
/ 30 августа 2009

Попробуйте использовать RedirectHandler. Для этого может потребоваться расширение DefaultHttpClient для возврата вашей пользовательской реализации из createRedirectHandler().

1 голос
/ 06 апреля 2013

RedirectHandler кажется устаревшим, мне удалось автоматически отключить отслеживание ответов перенаправления, изменив RedirectionStrategy по умолчанию для DefaultHttpClient, например:

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, но она выполняет свою работу.

0 голосов
/ 30 августа 2009

быстрый гугл представил: http://hc.apache.org/httpclient-3.x/redirects.html

...