jQuery的ajax crossDomain属性的用法?

Roy*_*mir 25 javascript ajax jquery

根据jQuery:

crossDomain (default: false for same-domain requests, true for cross-domain requests)类型:Boolean如果要在同一域上强制执行crossDomain请求(例如JSONP),请将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);
}
Run Code Online (Sandbox Code Playgroud)

并且即时通讯指定datatype:jsonp,然后响应将是application/javascript mime typed,因为它是一个将在我的浏览器中运行的脚本.

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

我做了一个样本

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

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

测试#1:

es3.com以下位置运行代码:(左窗格)从以下位置
运行代码es2.com:(右窗格)
crossDomain:false(缺少时默认).

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

在此输入图像描述

测试#2:

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

(http://i.stack.imgur.com/xEcyd.jpg) 在此输入图像描述

我没有看到任何区别.

题 :

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

Sil*_*Fox 16

默认crossDomain情况如下:

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

data-type解释不同,具体取决于该值crossDomain设置:

"json":将响应计算为JSON并返回JavaScript对象.跨域"json"请求将转换为"jsonp",除非请求选项中包含jsonp:false

因为您使用jsonp而不是json您将不会在您的测试中看到任何差异.

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

如果您要发出相同的域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错误.


Dhr*_*hak 5

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

您有以下要求:

  1. 拥有一个网页es2.com

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

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

    (a)crossdomain禁用:您的es2.comapi 会发现用户是西班牙人,因此会执行 http 重定向到spanish.es2.com,由于 ajax 相同域策略,这将不起作用,并且 ajax 会失败。ajax url 中的重定向 -> 不允许。

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

希望这能够清楚地说明这一点。

  • @RoyiNamir 例如 302 或 301 重定向。例如。`http://es2.com/api?user=a&amp;lang=spanish&amp;method= Three` 执行 302 重定向到 `http://spanish.es2.com/api?user=a&amp;method=tres` (2认同)