使用CORS XHR时,浏览器不发送cookies

编辑 – 使用Chrome浏览器查看cookies,看起来无论cookie的过期值是什么,浏览器都会将其设置为会话cookie,并根据请求删除它。

我正在使用Node.js和Express为我正在教授的课程构build一个CORS示例。

但是,尽pipe从服务器设置了Cookie,但在下列请求中不会将它们发送回服务器。 这几乎意味着我不能使用任何微不足道的会话pipe理器。

任何想法,我在这里失踪? 为什么浏览器不会将由域设置的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中间件,它们做的是相同的事情,没有明显的差别

至于情景:

  1. 使用XHR进行CORS请求
  2. 服务器设置一个cookie,成功地发送回客户端(快速会话cookie)
  3. 下一个XHR请求不会将该cookie发送回服务器,因此express不能识别用户,因此会创build一个新的会话cookie等等。

除了我读过的东西外,我不知道这些,但根据MDN文档 ,XHR对象上有一个“withCredentials”属性,需要设置:

 xhr.withCredentials = true; 

默认情况下,它是false 。 如果没有设置该标志,cookies将不会被传输,响应中的cookie标头将被忽略。

编辑 – 我发誓我几次读你的问题,但我完全错过你提到的国旗。 抱歉。 但是,这并不是完全浪费,我还要提到你的服务器需要在响应头中设置“Access-Control-Allow-Credentials”标志为true ,而“Access-Control-Allow- Origin“设置为您当前的协议+主机+端口。

这发生在我以前,我可以告诉它是非常愚蠢的。

如果您使用的是虚拟机,则通常会在需要时暂停/恢复。

这意味着与主机或您使用的任何客户机相比,虚拟机的date通常要晚一些(或更多)。

因此,当服务器设置cookie过期date(通常在当前date之后几个小时)时,它已经在客户端上过期了。 因此,客户端不保留它。

要在虚拟机上更新你的date,我build议你只使用ntpdate ,或者你可以手动设置date,看看是否是这个问题:

 # 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 

我有类似的问题,事实certificate,浏览器设置阻止了第三方cookie(Chrome>设置>高级设置>隐私>内容设置>阻止第三方Cookie和网站数据)。 解除封锁解决了问题!

我只是有这个问题,在我的情况下解决scheme是添加到cookie的path,所以添加cookie时,您必须使用:

document.cookie = 'cookieName=cookieValue;path=/';

这样浏览器将能够在新的请求中发送cookie。

PS:你还需要xhr.withCredentials = true; 如果您正在使用跨域请求。