文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

上周我收到一个来自API供应商的漏洞报告。该漏洞报告指出,我们的应用由于Apache HTTP 客户端没有忽略掉负载均衡器设置的cookies而绕过了该API供应商的负载均衡器。

这是一个很大的问题,因为当API供应商更新他们的服务器时,这个漏洞可能引起不必要的错误。更糟糕的是,这个API对我们应用至关重要,我们真的不能容忍任何不必要的停机时间。

让我们一起探索如何修复这个问题。

第 1 段(可获 1.14 积分)

通过 RestTemplate 来使用 Apache HTTP Client 4

默认情况下, RestTemplate 类会通过使用从java.net包里找到的标准类来创建 HTTP 请求。 因为我们想为了这个目的来使用Apache HTTP 客户端,所以我们就需要对我们的应用上下文配置类作如下的变更:

  1. 创建一个新的 ClientHttpRequestFactory bean。因为我们想使用 Apache HTTP 客户端,所以我们就必须创建一个新的HttpComponentsClientHttpRequestFactory 对象,并且配置潜在的 Apache HTTP 客户端的连接和读取超时时间。
  2. 创建一个新的RestTemplate bean,并且配置要使用的ClientHttpRequestFactory 对象。
第 2 段(可获 1.19 积分)

以下是我们的应用上下文配置类的源代码:

import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfiguration {

   	@Bean
    public ClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = 
				new HttpComponentsClientHttpRequestFactory();
        
		factory.setConnectTimeout(5000);
        factory.setReadTimeout(10000);
        
		return factory;
    }

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
        return new RestTemplate(clientHttpRequestFactory);
    }
}

 

第 3 段(可获 0.15 积分)

接下来,我们需要确保Apache HTTP Client将所有的Cookies忽略掉。

禁用Apache HTTP Client 4的Cookies

当我们想要禁用RestTemplate 所使用的Apache HTTP Client的cookie管理功能时(或者以任何方式改变其配置),我们就需要使用HttpClientBuilder创建一个新的HttpClient 对象,并且确保我们的RestTemplate bean 使用已经创建的HttpClient 对象。

在我们创建了一个新的可以忽略Coolies并且通过系统属性读取其配置的HttpClient 对象之后,我们的应用上下文配置类的源代码看起来就该如下面一样:

第 4 段(可获 1.28 积分)

让我们来总结一下我们从这篇博文里学到了什么。

总结

这篇博文教会了我们三件事情:

  • 如果我们想要确保RestTemplate 使用 Apache HTTP client 而不是使用标准的java.net 包里的类的话,我们需要创建一个新的HttpComponentsClientHttpRequestFactory 对象,并且让RestTemplate bean 使用这个创建好的对象。
  • 我们可以使用HttpClientBuilder 类来创建新的HttpClient 对象。
  • 如果我们想改变潜在的 Apache HTTP client的配置的话,我们需要创建一个新的HttpClient 对象,并且让HttpComponentsClientHttpRequestFactory 对象使用这个创建好的对象。
第 5 段(可获 1.23 积分)

文章评论