我有一个网站,我输入用户名/密码并单击登录按钮。登录按钮创建一个 XMLHttpRequest 对象,并将其触发。
在 Chrome、Firefox、Opera、Safari、Android 设备、iOS 设备上运行良好。只要我使用 HTTP 地址而不使用 HTTPS,IE9 就可以正常工作。
在 HTTPS 上,IE9 的行为如下:
第一个登录请求永远不会返回任何内容。F12 屏幕确实在网络选项卡中显示了我的登录请求,并且一切看起来都正确。脚本选项卡永远不会引发错误。根本没有任何反应。
这是疯狂的部分: - 如果我再次单击登录,它确实有效。- 如果我在浏览器上单击刷新,然后登录,那也可以!
我提出如下要求:
var x = new XMLHttpRequest();
x.open("POST", "/Relative/URL/Path", true);
x.setRequestHeader("Content-Type", "text/plain");
x.onreadystatechange = function () {
if ((x.readyState == 4) && (x.status == 200)) {
// handle callback
}
}
x.send(my request);
当这失败时,调试器将从 x.send() 行进入 onreadystatechange 代码。readyState 将是 1。这将是我可以调试的最后一个,因为没有其他任何事情发生。
任何想法将不胜感激。
[编辑]:我让一个请求去看看会发生什么。onreadystatechange 事件再次触发,readyState = 4 和 status = 12152。IE9 的 F12 屏幕中的网络视图显示结果为 Aborted,所用时间为 1589.07s。谷歌搜索显示这意味着服务器上的连接已关闭。
[编辑 2]:根据下面的评论,我重新编写了这段代码,只使用 jQuery 的 ajax() 方法。我认为这可能有机会消除我的不良代码。没有这样的运气。发生相同的行为。
$.ajax({
"url": sUrl,
"success": function (data, textStatus, x) {
workerCallback(data, id, "");
},
"error": function (x, testStatus, errorThrown) {
workerCallback("nc", id, errorThrown);
},
"contentType": "text/plain",
"data": JSON.stringify(req),
"dataType": "json",
"timeout": 1600000,
"type": "POST"
});
[最终更新:] 我已经更新了代码。如果发生超时,我只需重新发布相同的请求 - 仅一次。相当黑客,但它的工作原理。除非有人找到解决方案,否则我会将赏金分配给人们在下面提出的一些有用的想法。