缓存摘要认证响应

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