keep-alive 是否总是使用 httpclient 在请求中发送以及如何防止发送它

Is keep-alive always sent in requests using httpclient and how to prevent sending it

我有一个 Java/Spring 项目,我在其中使用 Oauth2RestTemplate 并使其使用 HttpClient (org.apache.http.client.Httpclient) 而不是默认的 SimpleClient

HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); 

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
oAuth2RestTemplate.setRequestFactory(requestFactory);

关于这个,我想 know/understand 如果 keep-alive header 总是为所有请求发送?

如果总是发送,有没有办法禁止发送?我看到 post - 谈到禁用它,但它建议对 httpMethod 进行设置。我不确定如何在我上面描述的代码设置中访问这个 httpMethod。

keepAlive() 方法实现 ConnectionReuseStrategy,只是 returns false。请参阅 HttpClientBuilder 中的 setConnectionReuseStrategy()

您可能还想发送一个 Connection header,其值为 close

https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/ConnectionReuseStrategy.html

示例:

List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader(HttpHeaders.CONNECTION, "close"));
HttpClientBuilder builder = HttpClients.custom().setDefaultHeaders(headers)
  .setConnectionReuseStrategy(
    new ConnectionReuseStrategy() {
      @Override
      public boolean keepAlive(HttpResponse httpResponse, HttpContext httpContext) {
        log.info("**** keepAlive strategy returning false");
        return false;
      }
});
CloseableHttpClient httpClient = builder.build();
HttpGet httpGet = new HttpGet("https://google.com");
CloseableHttpResponse response = httpClient.execute(httpGet);
log.info("Response status: " + response.getStatusLine());
response.close();

一些附加信息:

1. Keep-Aliveheader

当大多数人说 keep-alive header 时,他们通常指的是另一个 header,叫做 Connection。两个 header 一起工作:

HTTP/1.1 200 OK
...
Connection: Keep-Alive
Keep-Alive: timeout=5, max=1000
...

Connection header 提示连接应该是 re-used。 Keep-Alive header 指定连接应保持打开的最短时间,以及连接可能 re-used 的最大请求数。

Connection header 的常用值是 keep-aliveclose。服务器和客户端都可以发送这个header。如果 Connection header 设置为 closeKeep-Alive header 将被忽略。

2。 HTTP/1.1 和 HTTP/2

对于 HTTP/1.1,默认情况下连接是持久的。 Keep-Alive header 已弃用(不再在 HTTP 规范中定义),尽管许多服务器仍然发送它们以实现向后兼容性。

无法处理 HTTP/1.1 持久连接的客户端应设置 Connection header 值为 close.

HTTP/2 使用多路复用; ConnectionKeep-Alive header 都不应该与 HTTP/2.

一起使用

3。代理和缓存的影响

一般来说,持久连接不能通过 non-transparent 代理工作。他们会默默地丢弃任何 ConnectionKeep-Alive headers.

4.连接处理

由于持久连接现在是 HTTP/1.1 的默认设置,我们需要一种机制来控制 when/how 它们的使用。对于 Apache http 客户端,ConnectionReuseStrategy 确定连接是否应该持久,而 ConnectionKeepAliveStrategy 指定连接的最大空闲时间为 re-usable.