Проблемы с HTTP-ответом «302 найдено» - PullRequest
0 голосов
/ 20 июня 2019

У меня проблемы с HTTP-ответом «302 найдено». В любом веб-браузере все работает отлично. Хотя это не работает, когда я пытаюсь программно перемещаться по некоторым URL через HTTP-клиент (httpcomponents). Я знаю, что существует множество подобных дискуссий. Но никто из них не помог мне до сих пор. Поэтому я поднимаю это здесь ..

Веб-страница, с которой я работаю, имеет двухфакторную аутентификацию. Он проходит первую часть аутентификации (запрос POST), которая требует логин / пароль. Он также проходит проверку подлинности второго шага (запрос POST), который является кодом SMS. Затем после этого, когда я нажимаю на какой-либо URL, сервер возвращает HTTP-ответ «302 найдено». Когда я посмотрел на заголовок HTTP-ответа, я увидел «Location: ./?logout». Я знаю, что 302 означает, что мне нужно перенаправить на URL-адрес, который отображается в заголовке ответа HTTP под ключом «Расположение». Но перенаправление на «выход из системы» после успешного входа в систему не имеет смысла. То же самое отлично работает в браузере и возвращает 200 OK все время. Я не мог понять, почему серверная часть возвращает 302 Найденный HTTP при использовании API, в то время как он возвращает 200 OK в браузере Я также не видел, чтобы браузер отправлял запросы на URL-адрес «выхода».

Вот как выглядит мой HttpClient (версия 4.4.1):

final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
    .register("http", new PlainConnectionSocketFactory())
    .build();

final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
connectionManager.setMaxTotal(30);
connectionManager.setDefaultMaxPerRoute(5);
final HttpHost localhost = new HttpHost("localhost", 80);
connectionManager.setMaxPerRoute(new HttpRoute(localhost), 10);

final int timeout = 20 * 1000;
final RequestConfig requestConfig = RequestConfig.custom()
    .setConnectTimeout(timeout)
    .setConnectionRequestTimeout(timeout)
    .setSocketTimeout(timeout)
    .setCookieSpec(CookieSpecs.STANDARD)
    .setCircularRedirectsAllowed(true)
    .setRedirectsEnabled(true)
    .build();

final CloseableHttpClient httpClient =
    HttpClients.custom()
            .setSSLSocketFactory(sslConnectionSocketFactory)
            .setConnectionManager(connectionManager)
            .setRedirectStrategy(new LaxRedirectStrategy())
            .setDefaultRequestConfig(requestConfig)
            .setDefaultCookieStore(new BasicCookieStore())
            .build();

Вот как я выполняю простой запрос GET:

CloseableHttpResponse httpResponse = null;

    try {
        final String url = "web-page-url";

        final HttpGet getRequest = new HttpGet(url);

        httpResponse = httpClient.execute(getRequest, getHttpContext(cookie));

        final StatusLine status = httpResponse.getStatusLine();

        if (status.getStatusCode() >= 200 && status.getStatusCode() < 300) {
            LOGGER.debug("Successfully executed '{}' URL", url);
        } else {
            LOGGER.warn("'{}' response came from '{}' URL", status.getStatusCode(), url);
        }
    } finally {
        if (httpResponse != null) {
            try {
                httpResponse.close();
            } catch (final IOException e) {
                LOGGER.error("Couldn't close HTTP response. Error:", e);
            }
        }
    }

Метод HTTP-контекста:

private HttpContext getHttpContext(final String cookie) {
    final BasicClientCookie clientCookie = new BasicClientCookie(cookie.split("=")[0], cookie.split("=")[1]);
    clientCookie.setDomain("webpage-domain-name");
    clientCookie.setPath("/");

    final BasicCookieStore cookieStore = new BasicCookieStore();
    cookieStore.addCookie(clientCookie);

    final HttpContext context = new BasicHttpContext();
    context.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
    return context;
}

Выше GET-запроса все время возвращается 302 кода ответа после успешного входа в систему. Любая идея / помощь будет принята с благодарностью!

...