11

我有一个网站,我输入用户名/密码并单击登录按钮。登录按钮创建一个 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"
   });

[最终更新:] 我已经更新了代码。如果发生超时,我只需重新发布相同的请求 - 仅一次。相当黑客,但它的工作原理。除非有人找到解决方案,否则我会将赏金分配给人们在下面提出的一些有用的想法。

4

3 回答 3

1

这似乎是一个奇怪的问题,如果不在 https 网站上查看代码,就很难对其进行测试。

如果您想要快速修复,您可以尝试执行初始(虚拟)请求,然后立即使用短暂的 setTimeout 中止它并发出第二个(真实)请求。

根据您的描述,它应该可以工作。

于 2012-10-07T12:57:20.243 回答
0

在第一个请求的调试过程中,这是通过

在此处输入图像描述

这个确切的错误有一个相关的帖子... IE 9 Javascript error c00c023f

作者在 onreadystatechange 处理程序中放了以下内容

if (xmlHttpRequest.aborted==true) { 
  stopLoadAnimation();
  return;
}

这可能有助于为您指明正确的方向。

于 2012-10-04T14:37:43.743 回答
0
  • 超时可防止请求在 readyState 1 处终止,并且之后由于内容嗅探而成功。

  • 使用 Web 服务器配置在登录表单上配置 SSL 客户端身份验证

  • 插入引用需要 SSL 客户端身份验证的 URL 的隐藏元素(例如图像)

  • 使用协议相关的 gif 超链接,例如//example.com/image.gif,避免 SEC7111混合内容漏洞

  • open方法的URL在使用HTTP时匹配域,但不匹配HTTPS,导致请求失败,但后续请求回退到安全区域策略

  • window.location.protocol使用和之间的比较document.location.protocol来检查脚本是否在与页面相同的上下文中执行

  • 将 JSON 作为 MIME 类型发送text/plain可能会触发内容嗅探

  • 比较失败请求和成功请求之间的Accept 标头

  • HTTPS 缓存可能是个问题

  • 可能需要设置Connection 标

  • 代理配置可能是个问题

  • 初始标头响应值可能太大(例如 HTTP 状态描述限制为 512 个字符)

  • document.readystate在初始请求上可能不完整,这会导致过早执行问题

  • 证书吊销检查可能会阻止初始 JSON POST,但允许 GET 回调之后的后续请求

  • 应使用回调范围而不是变量 x 来引用 readyState 和 status 属性,以避免使用闭包范围:

    函数 cb()
      {
      if ( (this.readyState === 4) && (this.status === 200) )
        {
        // 处理回调
        }
      }

    onreadystatechange = cb;
于 2012-10-09T20:55:16.963 回答