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
。
示例:
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-alive
和 close
。服务器和客户端都可以发送这个header。如果 Connection
header 设置为 close
,Keep-Alive
header 将被忽略。
2。 HTTP/1.1 和 HTTP/2
对于 HTTP/1.1,默认情况下连接是持久的。 Keep-Alive
header 已弃用(不再在 HTTP 规范中定义),尽管许多服务器仍然发送它们以实现向后兼容性。
无法处理 HTTP/1.1 持久连接的客户端应设置 Connection
header 值为 close
.
HTTP/2 使用多路复用; Connection
和 Keep-Alive
header 都不应该与 HTTP/2.
一起使用
3。代理和缓存的影响
一般来说,持久连接不能通过 non-transparent 代理工作。他们会默默地丢弃任何 Connection
或 Keep-Alive
headers.
4.连接处理
由于持久连接现在是 HTTP/1.1 的默认设置,我们需要一种机制来控制 when/how 它们的使用。对于 Apache http 客户端,ConnectionReuseStrategy
确定连接是否应该持久,而 ConnectionKeepAliveStrategy
指定连接的最大空闲时间为 re-usable.
我有一个 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
。
示例:
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-alive
和 close
。服务器和客户端都可以发送这个header。如果 Connection
header 设置为 close
,Keep-Alive
header 将被忽略。
2。 HTTP/1.1 和 HTTP/2
对于 HTTP/1.1,默认情况下连接是持久的。 Keep-Alive
header 已弃用(不再在 HTTP 规范中定义),尽管许多服务器仍然发送它们以实现向后兼容性。
无法处理 HTTP/1.1 持久连接的客户端应设置 Connection
header 值为 close
.
HTTP/2 使用多路复用; Connection
和 Keep-Alive
header 都不应该与 HTTP/2.
3。代理和缓存的影响
一般来说,持久连接不能通过 non-transparent 代理工作。他们会默默地丢弃任何 Connection
或 Keep-Alive
headers.
4.连接处理
由于持久连接现在是 HTTP/1.1 的默认设置,我们需要一种机制来控制 when/how 它们的使用。对于 Apache http 客户端,ConnectionReuseStrategy
确定连接是否应该持久,而 ConnectionKeepAliveStrategy
指定连接的最大空闲时间为 re-usable.