3

我正在编写一个 Web 应用程序,它从客户端浏览器获取脚本输入并通过 AJAX 将其发送到 Java servlet。收到脚本后,Java 类执行脚本并将一些信息发送回网页。

我现在正在测试的 Web 应用程序的一个重要组件是连接超时以及浏览器连接何时/是否会在很长一段时间后超时。对我来说,重要的是在 Java servlet 发送响应之前连接不会超时,或者至少应该处理超时。

我已经研究了处理这个问题的方法,我对需要做什么有一个模糊的理解,但首先,我决定尝试让连接超时,以了解在没有任何错误处理的情况下一切将如何表现. 昨天,我从客户端的脚本输入中向 servlet 发送了一个命令,该命令告诉 servlet 休眠到今天早上。今天早上回来发现,在 Chrome 中,成功接收到了 servlet 响应,并愉快地在浏览器中显示了自己。

在 IE7 中,我没有那么幸运 :(

在等待响应超过15 小时后,IE7 超时,而 Chrome 没有。我想要么两者都会超时,要么两者都不会。

此外,知道我正在使用 Struts2 框架可能会有所帮助。

谁能解释一下?

谢谢!

PS我试图在我的问题解释中尽可能详细,但我很乐意提供任何额外的信息。我也没有包含代码,因为我认为没有任何相关的,但是如果您想查看一些代码,请再次告诉我您希望我包含哪些代码。

4

1 回答 1

3

事实证明 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 在超时而不是“超时”时返回“错误”的文本状态......奇怪!

于 2012-06-27T14:01:46.767 回答