编辑 - 使用Chrome网络检查器查看Cookie,似乎无论Cookie的过期价值是多少,浏览器都会将其设置为会话Cookie,并根据请求将其删除。
我正在使用Node.js和Express为我正在教授的课程构建一个CORS示例。
但是,虽然从服务器设置了cookie,但是在下列请求时它们不会被发送回服务器。这几乎意味着我不能使用任何简单的会话管理器。
知道我在这里缺少什么吗?为什么浏览器不将域设置的cookie发送回该域?这不应该自动发生吗?
编辑 - 一些代码示例: 设置XHR请求:
var xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.widthCredentials = true;
xhr.onreadystatechange = function(res){
if (xhr.readyState == 4){
cb(res,xhr);
}
};
xhr.setRequestHeader("Content-Type",'application/json');
xhr.setRequestHeader('Accept','application/json');
xhr.send(JSON.encode({param:some_param}));
服务器:
function allowCrossDomain(req,res,next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type,Accept,X-Requested-With');
if (req.method!='OPTIONS') return next();
res.send(204);
}
//while configuring express
app.use(allowCrossDomain)
值得一提的是,我尝试了各种npm
中间件,这些中间件做同样的事情但没有可观察到的差异
至于情景:
答案 0 :(得分:22)
除了我读过的内容之外,我对此一无所知,但根据the MDN docs,XHR对象上有一个“withCredentials”属性,需要设置:
xhr.withCredentials = true;
默认情况下,它是false
。如果没有设置该标志,则不会传输cookie,并且会忽略响应中的cookie标头。
编辑 - 我发誓我几次读了你的问题,但我完全错过了你提到的旗帜。抱歉。但是,因为这不是一个完全浪费,我还要提到您的服务器需要在响应头中将{Access-Control-Allow-Credentials“标志设置为true
,并且”访问 - Control-Allow-Origin“设置为您当前的协议+主机+端口。
答案 1 :(得分:3)
此happened to me之前,我可以说它非常愚蠢。
如果您正在使用虚拟机,通常会在需要时暂停/恢复虚拟机等。
这意味着与主机或您正在使用的任何客户端相比,虚拟机的日期通常晚了几天(或更长)。
因此,当服务器设置cookie过期日期(通常在当前日期之后几个小时)时,它已在客户端上过期。因此,客户不保留它。
要更新虚拟机上的日期,建议您使用ntpdate
,或者您可以手动设置日期以查看是否存在问题:
# what's the date?
date
# You'll see if it's the problem already
# If it is, here is how to manually set it
date -set 2012-07-22 # yyyy-mm-dd
date -set 17:00:42 # hh:mm:ss
答案 2 :(得分:2)
我刚遇到这个问题,我的案例中的解决方案是添加cookie的路径,因此在添加cookie时必须使用:
document.cookie = 'cookieName=cookieValue;path=/';
PS:如果您使用跨域请求,还需要xhr.withCredentials = true;
。
答案 3 :(得分:0)
我遇到了类似的问题,结果发现浏览器设置阻止了第三方Cookie(Chrome>设置>高级设置>隐私>内容设置>阻止第三方Cookie和网站数据) 。解锁解决了这个问题!