Я пытаюсь выполнить HTTP-вызов серверной части с аутентификацией SPNEGO. Сама часть аутентификации SPNEGO, похоже, работает в соответствии с журналами трассировки, но вход в систему не выполняется, потому что серверная часть имеет состояние, а файл cookie сеанса, который он отправляет обратно с первым ответом 401, не используется httpclient. Я могу видеть в журнале трассировки, как httpclient отправляет первый запрос, получает 401 с заголовком "set-cookie", но не обрабатывает этот файл cookie; а затем, когда httpclient отвечает новым запросом с заголовком «Авторизация», cookie отсутствует; из-за этого сервер запускает еще один вход в систему с нуля и просто снова отвечает 401, с новым заголовком «set-cookie» и новым сеансом.
После неудачного рукопожатия httpclient действительно обрабатывает новый, второй файл cookie сеанса и сохраняет его; это также видно в журнале трассировки. Мой код обработки файлов cookie выглядит так:
BasicCookieStore cookieStore = new BasicCookieStore();
HttpClientBuilder clientBuilder = HttpClients.custom()
.setConnectionManager(SslHandler.createClientConnectionManager(adapterType))
.setRedirectStrategy(new IgnoreRedirectStrategy())
.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))
.setDefaultHeaders(allHeaders)
.setSSLHostnameVerifier(SslHandler.getHostnameVerifier(adapterType))
.setDefaultRequestConfig(defaultRequestConfig)
.setDefaultCookieStore(cookieStore);
RequestConfig localConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD)
.build();
request.setConfig(localConfig);
CloseableHttpClient client = clientBuilder.build();
localcontext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
org.apache.http.HttpResponse response = client.execute(request, localcontext);
Итак, в основном вопрос: нужно ли делать что-то особенное, чтобы разрешить хранение / обработку файлов cookie во время рукопожатия SPNEGO или NTLM? Вроде работает вне таких рукопожатий, но не во время них.