У меня проблемы с 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 кода ответа после успешного входа в систему. Любая идея / помощь будет принята с благодарностью!