修复 IE8 中的跨域请求



我正在尝试修改IE8中破坏的一些现有代码。从我在网上读到的内容来看,这是一个涉及XDomainRequest和XMLHttpRequest的常见问题。

我以前没有以这种方式使用过 AJAX,所以我在竞争中不知道该怎么做。代码如下:(我已将括号"[["和"]]"中的敏感信息替换为任意变量名称,以标识每个变量的使用位置):

jQuery(document).ready(function() {
    var base_url = '[[BASE_URL_1]]';   // DTRT for ajax requests (CORS over HTTP by default)
    if (document.location.protocol == "https:") {
        base_url = '[[BASE_URL_2]]';    // The proxy script that lets us do secure cross-domain AJAX requests
    }
    var classSpec = '$class_spec';
    $('#[[ID_1]]').empty().addClass('loading'); // loading gif
    $('#[[ID_2]]').empty().addClass('loading');
    $.ajax( {
         type: "GET",
          url: base_url + '[[URL_1]]' + classSpec + '[[URL_2]]',
      success: function (data) { $('[[ID_2]]').html(data).removeClass('loading'); }
    } );
    $.ajax( {
         type: "GET",
          url: base_url + '[[URL_1]' + classSpec + '[[URL_3]]',
      success: function (data) { $('[[ID+1]]').html(data).removeClass('loading'); initialize(); }
    } );
});

如何修改此代码以包含对 IE8 的支持?

要执行跨域请求,您可能需要检查以下内容

  1. jQuery.support.cors = true;
  2. 跨域 = 真;
    • http://api.jquery.com/jQuery.ajax/
  3. 访问控制允许源标头
    • http://msdn.microsoft.com/en-us/library/dd573303%28v=vs.85%29.aspx
    • https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS

1 & 2

jQuery(document).ready(function() {
    var base_url = '[[BASE_URL_1]]';   // DTRT for ajax requests (CORS over HTTP by default)
    if (document.location.protocol == "https:") {
        base_url = '[[BASE_URL_2]]';    // The proxy script that lets us do secure cross-domain AJAX requests
    }
    var classSpec = '$class_spec';
    $('#[[ID_1]]').empty().addClass('loading'); // loading gif
    $('#[[ID_2]]').empty().addClass('loading');
    jQuery.support.cors = true;
    $.ajax(
    {
        crossDomain: true,
        type: "GET",
        url: base_url + '[[URL_1]]' + classSpec + '[[URL_2]]',
        success: function (data) { $('[[ID_2]]').html(data).removeClass('loading'); }
    } );
    $.ajax(
    {
        crossDomain: true,
        type: "GET",
        url: base_url + '[[URL_1]' + classSpec + '[[URL_3]]',
        success: function (data) { $('[[ID+1]]').html(data).removeClass('loading'); initialize(); }
    } );
});

3)实际上要求您有权访问要与之通信的服务器。基本上,远程服务器对浏览器说:嘿,我允许这些域执行XDR请求,如果您不是其中之一..请不要发送任何内容。(就个人而言,这是我见过的最疯狂的安全场景..由于这取决于请求者,因此不要向不需要他请求的域发出请求。这听起来真的很安全,海因!

因此,如果您在服务器 site1.com 上并希望 XDR 以 site2.com,那么 site2.com 必须返回一个标头,例如

访问控制允许来源: *

访问控制允许来源:site1.com

使用 IIS 服务器时,您可能还需要提供: 访问控制允许方法


以上通常适用于所有浏览器,而不仅仅是IE8,有关IE8的细节,请在此处查看:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

我建议尝试这个库:https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

在 jQuery 1.5+ 中使用 $.ajax 函数时,使用 IE8 和 IE9 的 XDomainRequest 对象实现自动跨源资源共享支持"

它确实具有与XDomainRequest相同的限制,即:

为了在 Internet Explorer 中使用 XDomainRequest,请求必须是:

  • 仅获取或发布
    • 发布时,数据将始终以文本/纯文本的内容类型发送
  • 仅 HTTP 或 HTTPS
    • 协议必须与调用页面的方案相同
  • 始终异步

看起来您正在检查匹配的协议,因此您应该在那里被覆盖。

相关内容

  • 没有找到相关文章

最新更新