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

Chr*_*ris 5 ajax jquery json 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
});
Run Code Online (Sandbox Code Playgroud)

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

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

我理解并期待第一个案例.有人可以向我解释第二种情况下的例外情况吗?我原以为要求至少要求.

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

Ben*_*bee 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 }
});
Run Code Online (Sandbox Code Playgroud)

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


Sud*_*oti 0

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