第一个XMLHttpRequest失败,但只在IE9上
我有一个网站,我输入用户名/密码,然后单击登录按钮。 登录按钮创建一个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,状态= 12152. IE9的F12屏幕中的网络视图显示结果为中止,时间为1589.07s。 Google搜索显示,这意味着服务器上的连接已关闭。
[编辑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"
});
[最后更新:]我更新了代码。 如果发生超时,我只需重新发布相同的请求 - 仅限一次。 非常黑客,但它的工作。 除非有人找到解决办法,否则我会在下面几个有用的想法之间分割赏金。
这似乎是一个奇怪的问题,如果不在https网站上查看代码,就很难对其进行测试。
如果你想快速修复,你可以尝试做一个初始的(虚拟)请求,然后用一个简短的setTimeout立即中止它,并发出第二个(真实)请求。
根据你的描述,它应该工作。
在第一次请求的调试期间,这是通过了
有一个相关的帖子,以确切的错误... IE 9 JavaScript错误c00c023f
作者将下列内容放入onreadystatechange处理程序中
if (xmlHttpRequest.aborted==true) {
stopLoadAnimation();
return;
}
这可能有助于您指出正确的方向。
超时可防止请求在readyState 1处终止,并且由于内容嗅探,此后会成功。
使用Web服务器配置在登录表单上配置SSL客户机验证
插入引用需要SSL客户端身份验证的URL的隐藏元素(如图像)
使用协议相关的gif超链接,例如//example.com/image.gif
,以避免SEC7111混合内容漏洞
打开方法的URL与使用HTTP时的域匹配,但不匹配导致请求失败的HTTPS,但后续请求回退到安全区域策略
使用window.location.protocol
和document.location.protocol
之间的比较来检查脚本是否在与页面相同的上下文中执行
以MIME类型text/plain
发送JSON可能会触发内容嗅探
比较失败的请求与成功的请求之间的Accept头
HTTPS缓存可能是一个问题
连接标题可能需要设置
代理配置可能是一个问题
初始头响应值可能太大(例如HTTP状态描述有512个字符的限制)
document.readystate在初始请求中可能不完整,这会导致过早执行问题
证书吊销检查可能会阻止初始JSON POST,但允许GET回调后的后续请求
readyState和status属性应该使用回调范围而不是变量x来引用,以避免使用闭包范围:
function cb() { if ( (this.readyState === 4) && (this.status === 200) ) { // handle callback } } onreadystatechange = cb;链接地址: http://www.djcxy.com/p/22307.html
上一篇: The very first XMLHttpRequest fails but only on IE9
下一篇: Chrome plugin development: user:pass@url not supported by Google Chrome anymore?