我使用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?
答案 0 :(得分:16)
检查Chrome是否设置为阻止第三方Cookie:
菜单→设置→显示高级设置...→隐私:内容设置
确保&#34;阻止第三方Cookie和网站数据&#34;未经检查。或者,如果您还有其他阻止第三方cookie的内容,也会禁用它。
如果在执行跨站点JSONP请求时遇到同样的问题,则不会跨域的任何标记请求发送cookie。