关于javascript:jQuery的ajax crossDomain属性的用法?

Usages of jQuery's ajax crossDomain property?

根据jQuery:

crossDomain (default: false for same-domain requests, true for
cross-domain requests)
Type: Boolean If you wish to force a
crossDomain request (such as JSONP) on the same domain, set the value
of crossDomain to true. This allows, for example, server-side
redirection to another domain. (version added: 1.5)

我不理解以上内容。

如果代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$(document).ready(function ()
{
    $.ajax(
    {
        url: 'http://es3.com/Handlers/MyHandler.ashx',
        cache: false,
        dataType:"jsonp",
        ...
        ...
    });
});

function aaa(json)
{
    alert(json.result);
}

然后指定datatype:jsonp,则响应将是application / javascript mime类型的,因为它是将在我的浏览器中运行的脚本。

当我在同一域中运行此代码时,我看不出为什么它不会那样工作。 (因此-我看不到此属性的用法)。

我做了一个样本

我有2个(已调整主机的)域。 es2.comes3.com

(注意,代码中的url始终是es3.com)。

测试#1:

运行es3.com中的代码:(左窗格)
es2.com运行代码:(右窗格)
crossDomain:false(缺少时为默认值)。

看看差异:(http://i.stack.imgur.com/RKyZp.jpg)

enter object. Cross-domain"json" requests are converted to"jsonp" unless
the request includes jsonp: false in its request options

因为您使用的是jsonp而不是json,所以您的测试不会有任何区别。

When do I need to set the crossDomain property ?

如果您正在发出相同的域json请求,并且您的站点可能将请求重定向到另一个域以提供响应(通过HTTP 3XX),则应将crossdomain属性设置为true,以便响应可以被调用脚本读取。

这为您提供了在发出相同原始请求时检索JSON的优点,以及在进行跨域请求时提供JSONP的功能。如果您重定向到的域上的CORS处于活动状态,则可以在请求选项中设置jsonp: false

例子

从example.com向example.org发出请求。

  • crossdomain自动设置为true。
  • 数据类型设置为jsonp

结果:example.org返回的JSONP。

从example.com向example.com发出请求。

  • crossdomain自动设置为false。
  • 数据类型设置为jsonp

结果:example.com返回的JSONP。

从example.com向example.org发出请求。

  • crossdomain自动设置为true。
  • 数据类型设置为json

结果:example.org返回的JSONP。

从example.com向example.com发出请求。

  • crossdomain自动设置为false。
  • 数据类型设置为json

结果:example.com返回的JSON。

从example.com向example.org发出请求。

  • crossdomain自动设置为true。
  • 数据类型设置为json
  • jsonp设置为false。
  • example.org不支持example.com的CORS

结果:浏览器返回的CORS错误。

从example.com向example.com发出请求,example.com将AJAX重定向到example.edu。

  • crossdomain手动设置为true。
  • 数据类型设置为json

结果:example.edu返回的JSONP。

从example.com向example.org发出请求。

  • crossdomain自动设置为true。
  • 数据类型设置为json
  • jsonp设置为false。
  • example.org确实支持example.com的CORS

结果:example.org返回的JSON。

从example.com向example.com发出请求,example.com将AJAX重定向到example.edu。

  • crossdomain自动设置为false。
  • 数据类型设置为json
  • example.edu不支持example.com的CORS

结果:浏览器返回的CORS错误。


让我们假设您有另一个域spanish.es2.com,该域为您的网站的西班牙用户提供服务。

您具有以下要求:

  • es2.com

    上有一个网页

  • es2.com上调用一个api,并向其传递一些用户信息(或cookie),并获取一些用户数据。但是如果用户
    如果是西班牙语,则需要为同一数据调用spanish.es2.com上的api。

  • 对于西班牙用户,当您使用jQuery从es2.com到es2.com进行ajax请求时,

    (a)禁用crossdomain:您的es2.com api将发现该用户是西班牙人,因此将http重定向到spanish.es2.com,由于ajax相同的域策略,该操作无法正常工作,而ajax会失败。重定向到ajax网址->不允许。

    (b)启用crossdomain:es2.com api的jsonp响应实际上是作为package在函数中的脚本标签加载的,因此http重定向到其他域没有关系,并且内容仍在加载,因此,ajax可以正常工作。
    重定向脚本标记的src->允许。

  • 希望这很清楚。


    据我所知,op是正确的。将dataType设置为jsonp会创建一个JSONP类型请求;将结果写入脚本块并运行。因此,通过将跨域设置为true来强制JSONP似乎是多余的。

    但是。该文档说:"如果您想强制执行跨域请求(例如JSONP)",则意味着在其他情况下,您可能希望强制执行跨域行为。我不确定这些情况可能是什么。


    缺少时默认不是false。如果缺少域,则默认为true(如上面的第一个示例中所示)。我认为,即使不是在所有情况下,您都可以将其保留为默认值。

    此外,在设置跨域参数时,默认情况下,JQuery尝试使用CORS,而不是JSONP。

    这是来自JQuery的一些相关片段:https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js

    变量" xhrSupported" ...

    1
    xhrSupported = jQuery.ajaxSettings.xhr();

    ..用于检查CORS支持。...

    1
    support.cors = !!xhrSupported && ("withCredentials" in xhrSupported );

    ..在进行AJAX调用时被检查....

    1
    2
    3
    4
    5
    jQuery.ajaxTransport(function( options ) {
            var callback;

            // Cross domain only allowed if supported through XMLHttpRequest
            if ( support.cors || xhrSupported && !options.crossDomain )

    希望这会有所帮助!


    您的问题对我了解将jsonp与jQuery结合使用时遇到的问题非常有帮助。
    就我而言,我需要对外部域进行JSONP调用。
    但是该网址需要从我们的域中构造。

    例如,在这里,我假设我的网站在es2.com下

    es2.com上的

    JSONP调用
    es2.com重定向到es3.com?newConstructedUrl=someRandomValue
    es3.com?newConstructedUrl=NewCoolValue重定向到es2.com
    es2.com响应在响应

    中设置新的cookie

    该代码在localhost中工作正常,但是在es2环境中我们没有cookie。
    看到调试器,该请求是在es2环境中的XHR中完成的
    然后,我们需要将crossDomain参数设置为true。然后,即使在es2.com

    中也完成了JSONP请求

    希望我的用例很清楚!


    如果您已经在指定JSONP,则crossDomain参数的作用不大。它只是告诉jQuery要求JSONP,即使它是本地域。

    假设您正在使用返回JSON或JSONP的本地服务在计算机上工作。您可以使用普通的$.ajax()调用,效果很好。但是,在生产环境中,如果满足某些特殊条件,服务器会将您的请求重定向到其他域。 Prod需要询问JSONP,因为有时响应来自域外。

    使没有crossDomain: truedatatype: 'jsonp'$.ajax()调用假定响应可以是纯JSON,因此代码将在生产中失败。

    您还可以通过预先身份识别获得跨域XML,例如通过带有YQL的JSONP加载跨域XML,这实际上只是将其package在JSONP中。