CORS Cookie未在Chrome中发送

Ira*_*ate 12 jquery google-chrome cors

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

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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但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
Run Code Online (Sandbox Code Playgroud)

我相信服务器已正确设置以允许此来源和凭据,但它们甚至不会在Chrome的请求中发送.如果它是相关的,我的服务器(php w/Zend)设置

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

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

为什么Chrome不发送我的Cookie?

小智 16

检查Chrome是否设置为阻止第三方Cookie:

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

确保未选中"阻止第三方Cookie和网站数据".或者,如果你有其他东西阻止第三方cookie也禁用它.

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