Tomcat,HTTP Keep-Alive和Java的HttpsUrlConnection。

2022-09-02 22:08:55

我有两台Tomcat服务器,需要保持持久的连接以减少SSL握手。一台服务器(代理)位于 DMZ 中,而另一台服务器安全地位于另一个防火墙后面。代理基本上只是运行一个简单的servlet,在将请求转发到安全机器之前进行一些健全性检查。在初始请求中,机器在执行实际工作之前交换证书。因此,我想保持一个持久连接,超时几分钟。

要与安全服务器通信,代理上的 servlet 使用 。我已经设置了WireShark,我注意到无论我在安全计算机上为连接器设置什么值,TCP连接都会在大约5或10秒后关闭。这个数字似乎与我读到的缺省超时以及Java如何处理HTTP Keep-Alive相匹配。此链接说明,如果超时是由服务器发送的,则 Java 会遵守超时,否则它会在关闭连接之前使用 5 秒(直接连接)或 10 秒(代理连接)。HttpsUrlConnectionkeepAliveTimeoutKeep-Alive

我试图弄清楚的是,我该如何强制Tomcat发送Keep-Alive标头。不是,,但是 .Connection: Keep-AliveKeep-Alive: timeout=x

我已经尝试了Apache HTTP服务器,修改httpd.conf中的确实会导致Keep-Alive标头更改其超时值。此外,Java确实支持此超时。keepAliveTimeout

更新(12/23/11):在运行了更多的实验之后,我尝试使用Apache的HttpClient(3.1)而不是.0来编写一些快速而肮脏的代码。当设置为使用 Keep-Alive 时,HttpClient 似乎只是等待服务器关闭连接。我不知道它会等多久。我正在拍摄以保持HTTP连接处于活动状态3到5分钟。HttpsUrlConnection


答案 1

我能够使用 HttpClient 3.1 通过将 Tomcat 连接器中的 keepAliveTimeout 设置为 300000 来保持 HTTP 连接打开 5 分钟。我使用WireShark验证了服务器将终止连接,而HttpClient将简单地等待。通过 HttpClient 的后续请求重用现有的 TCP 连接(避免任何进一步的 SSL 握手)。但关键是要有一个HttpClient实例(即不要每次都创建一个)。这对大多数人来说可能是显而易见的,但我不确定HTTPClient的API机制是什么。简而言之,创建一个HttpClient实例,并为每个请求(POST,GET等)创建一个新的PostMethod,GetMethod等。这将导致 TCP 连接被重用。


答案 2

在Tomcat中,我设法使用HttpServletResponse.addHeader()在我的HttpServelet中设置标头,如下所示:

  response.addHeader("Connection", "Keep-Alive");
  response.addHeader("Keep-Alive", "timeout=60000");

我向WireShark确认,这确实适用于客户端的HttpUrlConnection。如果不设置“连接”标头,则它不起作用,因此您需要同时设置两者。


推荐