我正在尝试制作一个独立的 HTML 文件,该文件通过 CORS 向 RESTful JSON 服务发出跨域请求。
我的 jQuery ajax 请求:
var query = $.ajax(
{
type: 'GET',
url: 'http://localhost:8626/Home/About',
contentType: 'application/json',
dataType: 'json',
success: function (response)
{
alert('success');
alert(query.getAllResponseHeaders());
alert($.cookie('SessionID'));
},
error: function (x, e)
{
alert('error ' + e);
}
});
我在(ASP MVC3)服务器端设置了 Access-Control-etc 标头:
public ActionResult About()
{
Response.AddHeader("Access-Control-Allow-Origin", "*");
Response.AddHeader("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE");
Response.AddHeader("Access-Control-Allow-Headers", "Content-Type");
Response.SetCookie(new HttpCookie("SessionID", "1234"));
return Json(new { name = "John" }, JsonRequestBehavior.AllowGet);
}
除了饼干,一切都很好。我正确地得到了我的响应 JSON 数据。
但我也从服务器发回了一个 cookie。它没有在标题中显示为 Set-Cookie,也没有显示在 cookie 集合中。我在这里读到,要在跨域请求中获取 cookie,您需要在 $.ajax 调用中设置以下内容:
xhrFields:
{
withCredentials: true
},
当我添加这个时,调用不再有效,出现 JS 错误:
Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true.
显然,它对我的 Access-Control-Allow-Origin 标头为“*”感到不满。
由于这是一个平面的、独立的 HTML 文件(来自磁盘,而不是 HTTP 服务器),Chrome 传递一个等于“null”的 Origin 标头。我似乎无法覆盖此值——当我添加自定义 Origin 标头时,Chrome 显然会忽略它。
如果我返回 Access-Control-Allow-Origin = "null"(与请求中的 Origin 标头值匹配),我会收到 JS 错误:
Origin null is not allowed by Access-Control-Allow-Origin.
所以我不知道该怎么办。我无法使用通配符获取我的 cookie,并且允许“null”也不起作用。
这不可能吗?还是我错过了一步?