缓存摘要认证响应
Caching Digest Authentication Responses
我正在使用 Apache 的 HttpClient 与需要摘要式身份验证的服务器通信。
我使用如下凭据设置了一个 HttpClientContext:
@Bean
public HttpClientContext getCredentialsHttpClientContext() {
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(createCredentialsProvider());
context.setAuthCache(new BasicAuthCache());
return context;
}
稍后我使用此上下文从我的服务器流式传输数据:
public InputStream getInputStreamFromUrl(String url) throws IOException {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpResponse httpResponse = httpClient.execute(new HttpGet(url), clientContext);
return httpResponse.getEntity().getContent();
}
稍后在处理此输入流时,我需要使用 HttpClientContext 调用同一服务器,并且每个后续调用都需要身份验证。
是否可以将digest auth的结果缓存起来,使得后续的请求不需要再次认证?
@oleg 上面的评论为我指明了正确的方向。
我实际上创建了一个单例 HttoClientContext bean:
@Bean
public HttpClientContext getCredentialsHttpClientContext() {
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(createCredentialsProvider());
context.setAuthCache(new BasicAuthCache());
return context;
}
我将其注入到我在上述 getInputStreamFromUrl
方法中使用的服务中。
在其他情况下,我使用的是 RestOperations
模板。为了让它工作,我创建了以下 Spring bean,使用相同的 HttpClientContext singelton 创建了一个 RestTemplate
:
@Bean
public RestOperations getIcsCredentialedRestOperations() {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryWithContext(httpClient, httpClientContext);
return new RestTemplate(requestFactory);
}
在上面的示例中,HttpComponentsClientHttpRequestFactory 扩展了 HttpComponentsClientHttpRequestFactory,覆盖了返回我想要的上下文的 createHttpContext
方法。
我正在使用 Apache 的 HttpClient 与需要摘要式身份验证的服务器通信。
我使用如下凭据设置了一个 HttpClientContext:
@Bean
public HttpClientContext getCredentialsHttpClientContext() {
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(createCredentialsProvider());
context.setAuthCache(new BasicAuthCache());
return context;
}
稍后我使用此上下文从我的服务器流式传输数据:
public InputStream getInputStreamFromUrl(String url) throws IOException {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpResponse httpResponse = httpClient.execute(new HttpGet(url), clientContext);
return httpResponse.getEntity().getContent();
}
稍后在处理此输入流时,我需要使用 HttpClientContext 调用同一服务器,并且每个后续调用都需要身份验证。
是否可以将digest auth的结果缓存起来,使得后续的请求不需要再次认证?
@oleg 上面的评论为我指明了正确的方向。
我实际上创建了一个单例 HttoClientContext bean:
@Bean
public HttpClientContext getCredentialsHttpClientContext() {
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(createCredentialsProvider());
context.setAuthCache(new BasicAuthCache());
return context;
}
我将其注入到我在上述 getInputStreamFromUrl
方法中使用的服务中。
在其他情况下,我使用的是 RestOperations
模板。为了让它工作,我创建了以下 Spring bean,使用相同的 HttpClientContext singelton 创建了一个 RestTemplate
:
@Bean
public RestOperations getIcsCredentialedRestOperations() {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryWithContext(httpClient, httpClientContext);
return new RestTemplate(requestFactory);
}
在上面的示例中,HttpComponentsClientHttpRequestFactory 扩展了 HttpComponentsClientHttpRequestFactory,覆盖了返回我想要的上下文的 createHttpContext
方法。