我正在调查本地(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问题吗?
答案 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