CORS Ajax 请求来自带有 cookie 的平面 HTML 文件



我正在尝试制作一个独立的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)服务器端设置了访问控制等标头:

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.

显然,它抱怨我的访问控制允许源标头是"*"。

由于这是一个平面的独立HTML文件(来自磁盘,而不是来自HTTP服务器),Chrome传递的Origin标头等于"null"。我似乎无法覆盖此值 - 当我添加自定义 Origin 标头时,Chrome 显然忽略了它。

如果我返回访问控制允许来源="null"(匹配请求中的Origin标头值),我得到JS错误:

Origin null is not allowed by Access-Control-Allow-Origin.

所以我不知道该怎么办。我无法获得带有通配符的 cookie,并且允许"null"也不起作用。

这不可能吗?还是我错过了一步?

您的服务器需要允许具有此标头的凭据。

访问控制允许凭据:真

https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Credentials

尝试将您的页面放在现场并通过网络访问它(您可以将其安装到本地 Web 服务器中)。

如果您只想在Chrome上对其进行测试-有一个名为--disable-web-security的Chrome启动标志。

此链接是关于如何使用参数启动 Chrome:http://www.chromium.org/developers/how-tos/run-chromium-with-flags。

最新更新