jQuery的ajax crossDomain属性的用法?

时间:2014-01-21 10:16:22

标签: javascript jquery ajax

根据jQuery:

  

crossDomain (default: false for same-domain requests, true for cross-domain requests)类型:Boolean如果你想强制a   在同一个域上的crossDomain请求(例如JSONP),设置值   of CrossDomain为true。这允许,例如,服务器端   重定向到另一个域。 (版本增加:1.5)

我不明白上述情况。

如果代码是

$(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 typed,因为它是一个将在我的浏览器中运行的脚本。

当我在相同的域下运行此代码时,我没有看到任何理由为什么它不会那样。 (因此 - 我没有看到这个属性的用法)。

我做了一个样本

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

(注意,代码中的网址始终为 es3.com

测试#1:

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

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

enter image description here

测试#2:

es3.com运行代码:(左侧窗格)
es2.com运行代码:(右窗格)
crossDomain:true< ---通知

http://i.stack.imgur.com/xEcyd.jpgenter image description here

我认为没有任何区别。

问题:

为什么/何时我是否需要设置crossDomain属性?

6 个答案:

答案 0 :(得分:10)

default for crossDomain如下:

  对于同域请求,

为false,对于跨域请求,则为true

根据data-type设置的值,crossDomain的解释会有所不同:

  

" json":将响应评估为JSON并返回JavaScript   宾语。跨域" json"请求转换为" jsonp"除非   请求在其请求选项中包含jsonp:false

因为您使用的是jsonp而不是json,所以您不会发现测试中存在任何差异。

  

我什么时候需要设置crossDomain属性?

如果您要进行相同的域json请求,您的网站可能会将请求重定向到另一个域以提供响应(通过HTTP 3XX),那么您应该设置{ {1}}属性为true,因此您的调用脚本可以读取响应。

这使您可以在进行相同的原始请求时检索JSON,并在进行跨源请求时检索JSONP的功能。如果CORS在您重定向到的域上处于活动状态,则可以在请求选项中设置crossDomain

实施例

从example.com发送请求到example.org。

  • jsonp: false自动设为true。
  • 数据类型设置为crossDomain

结果:example.org返回的JSONP。

从example.com发送请求到example.com。

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

结果: example.com返回的JSONP。

从example.com发送请求到example.org。

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

结果:example.org返回的JSONP。

从example.com发送请求到example.com。

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

结果: example.com返回的JSON。

从example.com发送请求到example.org。

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

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

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

  • jsonp手动设置为true。
  • 数据类型设置为crossDomain

结果:example.edu返回的JSONP。

从example.com发送请求到example.org。

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

结果: example.org返回的JSON。

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

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

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

答案 1 :(得分:4)

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

您有以下要求:

  1. es2.com

  2. 上设置网页
  3. es2.com上调用api并向其传递一些用户信息(或cookie),并获取一些用户数据。但如果是用户 是西班牙语,spanish.es2.com上的api需要被调用相同的数据。

  4. 当您使用jQuery从es2.com到es2.com执行ajax请求时,对于西班牙语用户:

    (a)禁用crossdomain:您的es2.com api会发现用户是西班牙语,因此http重定向到spanish.es2.com,由于ajax相同而无效域策略和ajax将失败。重定向到ajax网址 - >禁止。

    (b)启用crossdomain:您的es2.com api的jsonp响应实际上是作为包含在函数中的脚本标记加载的,因此http重定向到其他域无关紧要,内容仍然是加载,因此ajax工作。 重定向脚本标记的src - >允许的。

  5. 希望这说清楚。

答案 2 :(得分:2)

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

然而。文档说“如果你想强制执行跨域请求,例如JSONP”,那么暗示可能存在其他可能需要强制跨域行为的情况。我不确定那些情况可能是什么。

答案 3 :(得分:1)

丢失时不是默认的假。如果缺少它,则默认为true,如果域不相同(如上面的第一个示例中所示)。我认为你可以在几乎所有情况下将其保留为默认值。

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

以下是JQuery来源的一些相关摘录:https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js

变量“xhrSupported”......

xhrSupported = jQuery.ajaxSettings.xhr();

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

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

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

jQuery.ajaxTransport(function( options ) {
        var callback;

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

希望这有帮助!

答案 4 :(得分:0)

如果您已经指定了JSONP,那么crossDomain参数不会做太多。它只是告诉jQuery要求JSONP,即使它是一个本地域。

假设您正在使用返回JSON或JSONP的本地服务处理您的计算机。您可以使用普通的$.ajax()来电,这样可以正常使用。但是,在生产中,如果您遇到某些特殊情况,服务器会将您的请求重定向到其他域。 Prod需要请求JSONP,因为有时响应来自域外。

在没有$.ajax()crossDomain: true的情况下进行datatype: 'jsonp'调用将假定响应可以是普通的JSON,因此代码将在生产中失败。

您还可以通过像loading cross-domain XML through JSONP with YQL这样的预先判断来获取跨域XML,这实际上只是将其包装在JSONP中

答案 5 :(得分:0)

你的问题对我理解我在使用jsonp jQuery时遇到的问题非常有帮助。
就我而言,我需要对外部域进行JSONP调用 但是网址需要从我们的域构建。

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

JSONP呼叫 es2.com
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请求

希望我的用例很清楚!