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
浏览器未在启用 CORS 的情况下跨域跨域发送 cookie