如何在Java Servlet容器上指定Http请求超时参数

25

我想知道在我的servlet(或所有servlet)中,哪里可以配置所有请求的超时时间?这是一个容器属性吗? 此外,这对不同的浏览器有什么影响?它们是否都遵从容器指定的参数? 或者请求超时时间根本不是我可以控制的东西,每个浏览器都会自行决定? (只是为了明确,我不是在谈论会话超时)


1
很好的问题。我读了你对上一个回答的评论,想知道你选择了什么方法来确保请求不被关闭。我自己也在尝试制作彗星,但不知道该如何做得正确。你能否提供一个解决方案?谢谢! - Dragos
@Dragos 我最终实现了一个简单的长轮询机制,在约29秒后将请求返回给用户(这比IE限制的30秒要少)。如果我现在面临同样的问题,我会尝试使用WebSockets API。 - Ittai
所以你在这里寻找一个超时时间,使得“在x时间”它可以刷新当前响应并终止当前线程,以便浏览器能够快速接收数据?顺便说一句,现在的浏览器似乎会等待“很多分钟”才会收到响应... - rogerdpack
3个回答

15

客户端(即等待HTTP请求响应的时间)的超时时间由客户端决定。对于IE,请参见此文,对于Firefox,请参见此文

您无法从服务器控制此超时时间。


首先感谢您的回复,这个问题无法通过客户端编程(JavaScript)来改变,对吗? - Ittai
你可以简单地终止处理请求的Java线程。 - Kevin Caravaggio

8

尽管您无法控制客户端超时,但可以让服务器非常不耐烦 :) 例如,在Tomcat上,您可以在连接器中执行此操作,

<Connector port="8080"  
  ...
  connectionTimeout ="5000"
  disableUploadTimeout="false" />

这会让服务器只等待5秒钟,然后关闭连接。浏览器将收到一个连接关闭的错误。您可以像处理客户端超时一样处理它。
当然,这仅在超时是由服务器引起而不是浏览器和服务器之间的连接问题时才有效。

“timeout” 在 Tomcat 连接器中不存在这样的参数。 - robsf
2
参数名是Connector标签内的connectionTimeout,像这样:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="120000" URIEncoding="UTF-8" redirectPort="8443" /> - Steven Lizarazo

3

你无法从服务器控制客户端的超时时间。但是,当你的长时间运行操作忙碌时,你可以每隔一段时间向客户端发送数据。这将防止客户端超时,并可用于向用户显示进度等。将数据写入从响应获取的OutputStream或Writer,并调用flush以向客户端发送部分数据。


如果使用xmlHttpRequest,如何获取部分数据?我已经阅读过,在IE中,直到请求完成之前,您无法访问数据。 - Ittai
1
是的,但只要有数据进来,客户端就不应该超时。 - Vinay Sajip
你说得没错,但是情况有点复杂,因为我正在实现Comet,所以我要么使用“长轮询”,因此需要更长的超时时间来保存请求,要么使用流式传输,这正是我认为David在建议的。无论如何,谢谢。 - Ittai
我同意David的观点。当需要长时间获取整个数据集时,将大量数据发送到OutputStream时会出现IOException问题。因此,我不得不使用分页开始发送少量数据。只要客户端能够得到一些东西,他们就会很满意。 - user3123690

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接