CORS Cookie未在Chrome中发送

时间:2014-06-11 23:05:17

标签: jquery google-chrome cors

我使用jQuery对其他域的ajax调用设置了一个简单的文件上传表单。浏览器有一个域的cookie,这个cookie随Firefox中的请求一起发送。但是,Chrome中不存在Cookie,导致无法登录。 我已经确认该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的请求中发送。如果它是相关的,我的服务器(php w / Zend)设置

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

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

为什么Chrome不发送我的Cookie?

1 个答案:

答案 0 :(得分:16)

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

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

确保&#34;阻止第三方Cookie和网站数据&#34;未经检查。或者,如果您还有其他阻止第三方cookie的内容,也会禁用它。

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