【问题标题】:Why does this cross-domain request work in other browsers but not IE9?为什么这个跨域请求在其他浏览器中有效,而在 IE9 中无效?
【发布时间】:2011-09-20 02:05:21
【问题描述】:

我有一些 Ajax 代码可以在 Safari、Chrome 和 Firefox 中运行,但不能在 IE9 中运行。

该页面位于http://foo.com/test.aspx 上,它正在向https://service.foo.com 上托管的网络服务发出 AJAX 请求。我以为我不会有任何跨域问题,但鉴于 IE9 阻止了它,看来我有:(

var tempUrl = "https://service.foo.com/dummy.svc/test?hi=bye";
$.get(tempUrl, "html");

正如我所提到的,该代码在其他 3 种浏览器中都可以工作,只是不能在 IE9 上工作。 (我只关心 IE9,不关心 IE8 或更早版本)。

我做了一些挖掘,在 MSDN 上找到了this article,上面写着:

跨域请求需要相互 网页与用户之间的同意 服务器。您可以发起一个 网页中的跨域请求 通过创建 XDomainRequest 对象 关闭窗口对象并打开一个 连接到特定域。这 浏览器会从 通过发送 Origin 域的服务器 标头与原点的值。 它只会完成连接 如果服务器响应 Access-Control-Allow-Origin 标头 * 或确切的 URL 请求页面。这种行为是一部分 万维网联盟 (W3C) 的 Web 应用程序工作 集团的客户端框架草案 跨域通信 XDomainRequest 对象集成。

在我走上使用 XDR 的道路之前,我想与比我聪明的人验证这是否是正确的方法。

  1. Response.AddHeader("Access-Control-Allow-Origin", "*");添加到我的页面
  2. 创建检测 IE9 并使用 XDR 的条件 jscript 代码,而不是我与 $.get 一起使用的常规 jquery 调用。

我是完全离开还是这样做的正确方法?

(假设这是正确的方法,Acecss-Control-Allow-Origin 响应标头在哪里——在我的页面上http://foo.com/test.aspx 或在网络服务上https://service.foo.com?)

【问题讨论】:

  • 一般来说,JQuery 知道浏览器的同源限制,不应该在不支持 CORS 的浏览器中尝试使用它。您是否在 IE9 的 F12 开发者工具控制台中看到脚本错误?
  • Eric,开发工具控制台中没有抛出错误。

标签: ajax cross-domain internet-explorer-9


【解决方案1】:

使用此自定义代码,而不是 $.ajax()

function newpostReq(url,callBack)
{
    var xmlhttp;
    if (window.XDomainRequest)
    {
        xmlhttp=new XDomainRequest();
        xmlhttp.onload = function(){callBack(xmlhttp.responseText)};
    }
    else if (window.XMLHttpRequest)
        xmlhttp=new XMLHttpRequest();
    else
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
            callBack(xmlhttp.responseText);
    }
    xmlhttp.open("GET",url,true);
    xmlhttp.send();
}

注意:这适用于 GET 请求。

要适应 POST 请求,请更改以下行:

function newpostReq(url,callBack,data)

data是post请求的URL编码参数如:key1=value1&key2=value%20two

    xmlhttp.open("POST",url,true);
    try{xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");}catch(e){}
    xmlhttp.send(data);

总而言之,以 POST 请求打开连接(第 1 行),将请求标头设置为 urlencoded 类型的 post 数据(使用 try-catch 包装以用于特殊浏览器)(第 2 行),然后发送数据(第 2 行) 3).

【讨论】:

  • 是的,它可以完美地处理 GET 请求,但是对于 IE8 和 IE9 中的 POST 请求我应该怎么做
  • 如果我想为 POST 请求做什么,我在我的服务中使用 CORS,需要在 IE8 和 IE9 中使用 POST 请求发送 JSON 数据
【解决方案2】:

我刚遇到同样的问题。

php 后端,正确的 mime,是的,

header('Access-Control-Allow-Origin: *');

几乎*在所有浏览器中都可以使用 - 除了 IE9。

似乎 jQuery.getJSON 不会自动为 ie9 执行 XDR - 在同一域上创建服务代理后,它起作用了。

* 几乎 - 歌剧也发生了。

edit:好的,opera确实和ie9有同样的问题。现在就像一个魅力。

注意:chrome、safari 和 firefoxes (3.6-5) 使用 ACAO:* 的跨域请求没有问题。

我不明白为什么 a) microsoft 对跨域请求使用不同的对象以及 b) 为什么 jquery 不透明地切换(或至少提供一个选项供选择)。

【讨论】:

    【解决方案3】:

    如果这在其他浏览器(支持 CORS)中有效,那么您的 SVC 似乎已经支持这一点,但可以肯定的是,使用 Fiddler2 来查看发生了什么。

    Access-Control-Allow-Origin 标头用于被请求的资源,而不是在请求它的页面上。

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多