【问题标题】:Fixing Cross-Domain Requests in IE8修复 IE8 中的跨域请求
【发布时间】:2013-10-19 19:05:58
【问题描述】:

我正在尝试修改一些在 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 的支持?

【问题讨论】:

  • 您是否在与之交谈的服务器上添加了正确的 Access-Control-Allow-Origin 标头?必须在其他服务器上明确允许 XDR。
  • @Robert 感谢您的指点。我不确定,因为我完全是这类问题的新手。我意识到在解决问题之前我需要掌握很多东西。我将尝试查明服务器标头,看看我能从那里找出什么。
  • @Robert Perl 控制器包含以下行:$c->response->header("Access-Control-Allow-Origin" => $server);

标签: jquery ajax internet-explorer-8 cors crossdomain-request.js


【解决方案1】:

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

  1. jQuery.support.cors = true;
  2. 跨域=真;
  3. Access-Control-Allow-Origin 标头

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 服务器时,您可能还需要提供:Access-Control-Allow-Methods


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

【讨论】:

    【解决方案2】:

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

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

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

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

    • 仅 GET 或 POST
      • POST 时,数据将始终使用 text/plain 的 Content-Type 发送
    • 仅 HTTP 或 HTTPS
      • 协议必须与调用页面的方案相同
    • 始终异步

    您似乎正在检查匹配的协议,因此您应该在此处进行检查。

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 2017-06-08
      • 2013-03-11
      • 2016-09-19
      • 1970-01-01
      • 2017-06-15
      相关资源
      最近更新 更多