缓存摘要式身份验证响应

时间:2015-11-11 20:44:20

标签: httpclient apache-httpclient-4.x

我正在使用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调用同一服务器,并且每个后续调用都需要进行身份验证。

是否可以缓存摘要身份验证的结果,以便后续请求不需要再次进行身份验证?

1 个答案:

答案 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方法。