Как получить файл cookie авторизации программно?

#java #rest #cookies

#java #rest #файлы cookie

Вопрос:

Я должен реализовать загрузку документа в систему архивирования через REST-интерфейс, используя Java с spring boot.

Мне сказали сначала сделать запрос GET с базовой аутентификацией. Это даст мне файлы cookie авторизации в ответе. Затем я должен отправить эти файлы cookie с POST-запросом, чтобы выполнить фактическое архивирование.

ПОЛУЧЕНИЕ работает нормально. Я прочитал в Интернете, что я должен получить файлы cookie в заголовке «Set-Cookie» ответа. Но я не получаю файлы cookie.

Странно то, что если я выполняю запрос с помощью Postman, я получаю 2 файла cookie («AuthSessionId» и «ClientID»). Почему я не могу получить их программно?

В качестве примечания: Postman также показывает, что я получил 15 (другое?) заголовки в ответе. У меня нет проблем с поиском их в моем ClientHttpResponse

Вот некоторый код:

 ClientHttpResponse response = request.execute();
    // this is  org.springframework.http.client.ClientHttpResponse

List<String> cookies =  response.getHeaders().get(HttpHeaders.SET_COOKIE);

if (cookies != null) {
    for (String cook : cookies) {
         System.out.println("cookie: "   cook);
    }
} else {
    System.out.println("no cookie in "   HttpHeaders.SET_COOKIE); // this is what I get
}
  

Комментарии:

1. Как вы создаете фабрику запросов? Например, если вы используете реализацию Apache HttpClient, она перехватывает заголовки файлов cookie и удаляет их, сохраняя вместо этого в хранилище файлов cookie, которые http-интерфейсы Spring не предоставляют. В этом случае вам было бы лучше использовать сами классы Apache HttpClient и прочитать о том, как получить доступ к файлам cookie для этого.

Ответ №1:

кумесана прав. Файлы cookie отфильтровываются и помещаются в CookieStore. Если я установил это раньше, я могу получить их после завершения запроса:

 CookieStore cookieStore = new BasicCookieStore();
CloseableHttpClient client = HttpClientBuilder
            .create()
            .setDefaultCredentialsProvider(credentialsProvider)  
            .setConnectionManager(poolingConnectionManager)    
            .setDefaultCookieStore(cookieStore)
            .build();