我正在编写一个Web应用程序,该应用程序从客户端浏览器获取脚本输入,并通过AJAX将其发送到Java servlet。收到脚本后,Java 类执行脚本并将一些信息发送回网页。
我现在正在测试的 Web 应用程序的一个重要组件是连接超时以及浏览器连接在很长一段时间后何时/是否会超时。对我来说,重要的是在Java servlet发送响应之前连接不会超时,或者至少应该处理超时。
我已经研究了处理这个问题的方法,我对需要做什么有一个模糊的理解,但首先,我决定尝试连接超时,以便了解一切将如何运行没有任何错误处理。昨天,我从客户端的脚本输入中向servlet发送了一个命令,该命令告诉servlet休眠直到今天早上。我今天早上回来发现,在Chrome中,servlet响应被成功接收,并愉快地显示在浏览器中。
在IE7中,我没有那么多运气:(
在等待响应超过 15 个小时后,IE7 超时,Chrome 没有。我想要么两者都会超时,要么两者都不会。
另外,知道我正在使用 Struts2 框架可能会有所帮助。
谁能解释一下?
谢谢!
附言我试图在我的问题解释中尽可能详细,但我很乐意包含任何额外的信息。我也没有包含代码,因为我认为任何代码都不相关,但同样,如果您想查看一些代码,请告诉我您希望我包含哪些代码。
事实证明,Chrome非常棒,而IE则不是(令人惊讶!以下是我很确定发生的事情:
在 ajax 调用中,由于没有设置超时,Chrome 让超时默认为 0,即从不超时。
IE7 是令人讨厌的浏览器(不幸的是,我必须为其开发浏览器),不希望这种情况发生,因此它坚持其注册表设置的默认超时为 60 分钟。
JQuery 和 AJAX 通过一些长轮询(或者至少我所理解的长轮询)使处理此错误变得轻而易举。这是我所做的:
初始 AJAX 请求(包含在函数中):
$.ajax({
beforeSend: function() {
inUse = true;
disableInput();
},
url: "executeScript.do",
data: params,
dataType: "text",
type: "post",
success: function(responseText) {
onSuccess(responseText);
},
error: function(jqXHR, textStatus, errorThrown) {
if(textStatus == "timeout") {
pollServlet();
}
}
});
...
长轮询(?
function pollServlet() {
var params = "testID=" + document.getElementById("testIDValue").value;
$.ajax({
url: "servletQuery.do",
dataType: "text",
type: "post",
data: params,
success: function(response) {
if(!isNaN(parseInt(response, 10))) {
setTimeout(pollServlet, parseInt(response, 10));
} else {
onSuccess(response);
}
}
});
}
这行得通!但是,我注意到的一件事是IE7在超时时返回"错误"的文本状态而不是"超时"...奇怪!