Ano*_*rma 3 apache-httpclient-4.x
我正在使用 apache HttpClient 4.5 在 java 中处理 http 请求。
根据文档 HttpClient 是线程安全的,因此我们可以对所有线程使用相同的 HttpClient 实例,但 HttpContext 应该由每个执行线程维护。
对于身份验证(NTLM 身份验证),我们需要将 CredentialsProvider 设置为上下文,这将在服务器上进行身份验证。
要求
所有请求都将使用相同的身份验证详细信息访问同一服务器。我只想在应用程序初始化或第一次请求服务器时进行一次身份验证,所有其他请求都应在同一会话中提供服务,但可以来自不同的线程。
我可以使用相同的上下文,因为使用相同的身份验证详细信息访问同一台服务器,还是有另一种方法来实现它?
尽管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());
}
Run Code Online (Sandbox Code Playgroud)
非常重要:NTLM 连接是有状态的,只有在与相同的用户身份相关联时才能在上下文之间重新使用。可以在连接HttpClient实例时关闭连接状态跟踪(如下所示)或在执行上下文中手动设置用户身份(如上所述)。
CloseableHttpClient client = HttpClientBuilder.create()
.disableConnectionState()
.build();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2643 次 |
| 最近记录: |