Я просматривал пример дайджест-аутентификации по адресу:
http://hc.apache.org/httpcomponents-client-4.3.x/examples.html
В моем сценарии есть несколько потоков, выдающих HTTP-запросы, и каждый из них должен быть аутентифицирован с использованием собственного набора учетных данных. Кроме того, учтите, что этот вопрос, вероятно, очень специфичен для HTTP-клиента Apache версии 4.3 и выше, 4.2 обрабатывает аутентификацию, вероятно, по-другому, хотя я сам не проверял. Тем не менее, вот собственно вопрос.
Я хочу использовать только один экземпляр клиента (статический член класса, то есть потокобезопасный) и предоставить ему диспетчер соединений для поддержки нескольких одновременных запросов. Дело в том, что каждый запрос будет предоставлять разные учетные данные, и я не вижу способа назначать учетные данные для каждого запроса, поскольку поставщик учетных данных устанавливается при создании http-клиента. Из ссылки выше:
[...]
HttpHost targetHost = new HttpHost("localhost", 80, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials("username", "password"));
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCredentialsProvider(credsProvider).build();
[...]
Проверка:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html#d5e600
Пример кода в пункте 4.4 (ищите 4.4. HTTP-аутентификация и контекст выполнения), по-видимому, говорит о том, что HttpClientContext получает кэш аутентификации и поставщика учетных данных, а затем передается в HTTP-запрос. Рядом выполняется запрос, и кажется, что клиент получит учетные данные, фильтруемые хостом в HTTP-запросе. Другими словами: если контекст (или кеш) имеет действительные учетные данные для целевого хоста текущего HTTP-запроса, он будет использовать их. Проблема для меня в том, что разные потоки будут выполнять разные запросы к одному и тому же хосту.
Есть ли способ предоставить пользовательские учетные данные для каждого HTTP-запроса?
Спасибо заранее за ваше время! :)