jQuery.Ajax“访问限制URI被拒绝”的解释?

时间:2012-02-28 09:30:54

标签: ajax json jquery cors

我正在调查本地(file:// access)html应用程序中.NET WCF域服务的跨域使用情况。该应用程序正在使用jQuery进行AJAX调用。

在服务器上没有身份验证(即匿名身份验证)的情况下,我已成功检索到JSON格式的数据,其中包含CORS“Access-Control-Allow-Origin:*”标头,并且没有标头的JSONP格式。

现在,我正在尝试了解使用JSON(而不是JSONP)格式数据进行身份验证和CORS标头时的行为。

以下jQuery代码将向服务器发送请求,而服务器又以“HTTP / 1.1 401 Unauthorized”响应。

$.ajax({
    url: myUrl,
    dataType: 'json',
    cache: false,
    complete: function () { /* do stuff */ },
    timeout: 5000,
    data: myData
});

以下jQuery代码不向服务器发出请求,并立即抛出异常“访问受限制的URI被拒绝”,代码1012.

$.ajax({
    url: myUrl,
    dataType: 'json',
    cache: false,
    complete: function () { /* do stuff */ },
    timeout: 5000,
    username: "chris",
    password: "password",
    data: myData
});

我理解并期待第一个案例。有人可以向我解释第二种情况下的例外情况吗?我原本预计会至少提出要求。

编辑:Grrr,这是在FF 10.0.2中。 Chrome似乎按照我的预期行事,这是一个FF问题吗?

2 个答案:

答案 0 :(得分:5)

如果您在跨源请求中使用Cookie或HTTP基本身份验证用户名/密码字段等凭据,则还需要将XHR上的“withCredentials”标志设置为true。在jQuery中,这是通过$ .ajax调用上的xhrFields属性完成的。将代码更改为

$.ajax({
    url: myUrl,
    dataType: 'json',
    cache: false,
    complete: function () { /* do stuff */ },
    timeout: 5000,
    username: "chris",
    password: "password",
    data: myData,
    xhrFields: { withCredentials: true }
});

此外,另一端的服务器不能使用带有凭据的Access-Control-Allow-Origin标头的“*”。它必须为发送给它的Origin标头提供完全匹配。

答案 1 :(得分:0)

您可以使用回调函数来克服这个问题: http://docs.jquery.com/Ajax/jQuery.ajax#options