第一个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.protocoldocument.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?