CORS cookie 未在 Chrome 中发送

Posted

技术标签:

【中文标题】CORS cookie 未在 Chrome 中发送【英文标题】:CORS cookie not sent in Chrome 【发布时间】:2014-08-02 03:58:35 【问题描述】:

我已经使用 jQuery 对不同域的 ajax 调用设置了一个简单的文件上传表单。浏览器有一个域的 cookie,这个 cookie 在 Firefox 中随请求一起发送。但是,cookie 不存在于 Chrome 中,导致无法登录。 我已经验证了 cookie 确实存在于 Chrome 中,只是没有随请求一起发送。

ajax 调用: 其中一些可能不是必需的。添加了尝试相关的解决方案并留下来演示这些尝试。

<head>
    <script src="jquery-2.1.1.min.js"></script>
</head>

<form enctype="multipart/form-data" id="file" method="POST">
    <input name="file" type="file" />
    <input name="Submit" type="button" id="upload"/>
</form>

<script type="text/javascript">
    $.support.cors = true

    $('input#upload').click(function()
        var formData = new FormData($('form#file')[0]);

        .ajax(
            url: 'http://accounts.mysite.dev/file/saveasset',
            type: 'POST',
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            xhrFields: 
                withCredentials: true
            ,
            crossDomain: true
        );
    );
</script>

Firefox 发送正确的标头,包括用户的 cookie

POST /file/saveasset HTTP/1.1
Host: accounts.mysite.dev
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://phptest/htmltest/fileUpload.html
Content-Length: 8032
Content-Type: multipart/form-data; boundary=---------------------------4450073521062221055385143281
Origin: http://phptest
Cookie: Accounts=somecookiestuff
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

但 Chrome 没有

POST /file/saveasset HTTP/1.1
Host: accounts.mysite.dev
Content-Length: 7981
Accept: */*
Origin: http://phptest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryGyMYxvKgEKWfBR5x
Referer: http://phptest/htmltest/fileUpload.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

我相信服务器设置正确以允许此来源和凭据,但它们甚至没有在 Chrome 的请求中发送。如果相关,我的服务器(带 Zend 的 php)设置

$this->_response->setHeader('Access-Control-Allow-Origin', 'http://phptest');
$this->_response->setHeader('Access-Control-Allow-Credentials', 'true');

我在服务器上没有看到任何 OPTION 预检请求。

为什么 Chrome 不发送我的 cookie?

【问题讨论】:

您希望在 FF 中设置的 Chrome 中看到什么 cookie?两个请求都有一个Origin 标头。 【参考方案1】:

检查 Chrome 是否设置为阻止 3rd 方 cookie:

菜单 → 设置 → 显示高级设置... → 隐私:内容设置

确保未选中“阻止第三方 Cookie 和网站数据”。或者,如果您有其他阻止 3rd 方 cookie 的东西,也将其禁用。

在执行跨站点 JSONP 请求时遇到同样的问题,cookie 不会在跨域的任何标记请求上发送。

【讨论】:

太棒了!我不认为这是默认设置,所以我一定在某个时候更改了它。 除了更改设置还有其他方法吗? 这只是咬了我们的一个开发人员并花费了我们一些时间。谢谢你。

以上是关于CORS cookie 未在 Chrome 中发送的主要内容,如果未能解决你的问题,请参考以下文章

CORS withCredentials XHR 预检未在 Firefox 中发布 Cookie

Cookie 未在 Chrome 跨域发布中发送

浏览器未在启用 CORS 的情况下跨域跨域发送 cookie

IE10 使用 CORS 时不发送 cookie

CORS - 服务器端 cookie 未保存在 chrome 浏览器上

即使所有 CORS 允许,Firefox 也不会保留跨域发送的 cookie