2017-02-01 5 views
0

Я использую apache HttpClient 4.5 для обработки HTTP-запроса в java.Single HttpClientContext для нескольких потоков

Согласно документации HttpClient является потокобезопасной, поэтому мы можем использовать один и тот же экземпляр HttpClient для всех потоков, но HttpContext должен поддерживаться каждым потоком выполнения.

Для аутентификации (проверка подлинности NTLM) нам необходимо установить CredentialsProvider в контекст, который будет проходить проверку подлинности на сервере.

Требование

Все запрос ударит один и тот же сервер с тем же детали аутентификации. Я хочу пройти проверку подлинности только один раз, когда приложение будет инициализировать или сначала запросить сервер, все остальные запросы должны обслуживаться в одном сеансе, но могут быть из разных потоков.

Могу ли я использовать тот же контекст, потому что попадание на тот же сервер с одинаковыми данными аутентификации, или есть другой способ его достижения?

ответ

1

Несмотря на то, что экземпляры HttpContext не должны делиться между потоками, нет ничего плохого в обмене потокобезопасными объектами между несколькими контекстами. Например, можно легко использовать те же экземпляры CredentialsProvider и AuthCache с несколькими параллельными контекстами.

// External dependencies 
CloseableHttpClient client; 
CredentialsProvider credentialsProvider; 
AuthCache authCache; 
CookieStore cookieStore; 
Principal userPrincipal; 

// request execution 
HttpClientContext context = HttpClientContext.create(); 
context.setCredentialsProvider(credentialsProvider); 
context.setAuthCache(authCache); 
context.setCookieStore(cookieStore); 
context.setUserToken(userPrincipal); 
HttpGet httpGet = new HttpGet("http://targethost/"); 
try (CloseableHttpResponse response1 = client.execute(httpGet, context)) { 
    System.out.println(response1.getStatusLine()); 
    EntityUtils.consume(response1.getEntity()); 
} 

ОЧЕНЬ ВАЖНО: соединения являются NTLM с сохранением состояния и могут быть повторно использованы между контекстами только в том случае, связанных с одной и той же идентификации пользователя. Можно либо отключить отслеживание состояния соединения при подключении к экземпляру HttpClient (как показано ниже), либо вручную настроить идентификатор пользователя в контексте выполнения (как указано выше).

CloseableHttpClient client = HttpClientBuilder.create() 
     .disableConnectionState() 
     .build(); 
+0

вы создаете «контекст», но вы его не используете. Я думаю, что правильным будет client.execute (httpGet, context) – Nightingale7

+0

Вы абсолютно правы. Исправленный. – oleg

Смежные вопросы