2017-02-01 2 views
0

java에서 http 요청을 처리하기 위해 HttpClient 4.5를 사용하고 있습니다.다중 스레드 용 단일 HttpClientContext

문서에 따르면 HttpClient는 스레드로부터 안전하므로 모든 스레드에 대해 동일한 HttpClient 인스턴스를 사용할 수 있지만 HttpContext는 실행 스레드별로 유지 관리해야합니다.

인증 (NTLM 인증)의 경우 CredentialsProvider를 서버에서 인증 할 컨텍스트로 설정해야합니다.

요구 사항

모두 동일한 인증 정보와 같은 서버를 공격합니다 요청. 응용 프로그램이 초기화되거나 서버에 처음 요청될 때 한 번만 인증하려고합니다. 다른 모든 요청은 동일한 세션에서 제공되어야하지만 다른 스레드에서 수행되어야합니다.

동일한 인증 정보를 사용하여 동일한 서버에 접속했거나 다른 방법을 사용할 수 있기 때문에 동일한 컨텍스트를 사용할 수 있습니까?

답변

1

HttpContext 인스턴스가 스레드간에 공유되어서는 안되지만 다중 컨텍스트간에 스레드 안전 개체를 공유하는 데는 아무런 문제가 없습니다. 예를 들어, 여러 개의 동시 컨텍스트가있는 동일한 CredentialsProviderAuthCache 인스턴스를 쉽게 사용할 수 있습니다.

// 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 연결 상태이고 동일한 사용자 ID와 관련된 경우에만 콘텍스트 사이에 재사용 될 수있다. HttpClient 인스턴스 (아래)를 연결하거나 실행 컨텍스트에서 수동으로 사용자 ID를 설정할 때 (위와 같이) 연결 상태 추적을 해제 할 수 있습니다.

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

"컨텍스트"를 만들지 만 사용하지 않습니다. 나는 올바른 것이 client.execute (httpGet, context)라고 생각한다. – Nightingale7

+0

당신은 절대적으로 옳다. 수정 됨. – oleg

관련 문제