我正在使用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调用同一服务器,并且每个后续调用都需要进行身份验证。
是否可以缓存摘要身份验证的结果,以便后续请求不需要再次进行身份验证?
答案 0 :(得分:0)
@ 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
方法。