浏览器在使用CORS XHR时不发送cookie

Ari*_*zer 20 javascript node.js cors express

编辑 - 使用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})); 
Run Code Online (Sandbox Code Playgroud)

服务器:

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)
Run Code Online (Sandbox Code Playgroud)

值得一提的是,我尝试过各种npm中间件,这些中间件做同样的事情而没有可观察到的差别

至于场景:

  1. 使用XHR发出CORS请求
  2. 服务器设置一个cookie,正在成功发送回客户端(快速会话cookie)
  3. 下一个XHR请求不会将该cookie发送回服务器,因此express无法识别用户,因此会创建新的会话cookie等等.

Poi*_*nty 25

除了我读过的内容之外,我对此一无所知,但根据MDN文档,XHR对象上有一个"withCredentials"属性,需要设置:

xhr.withCredentials = true;
Run Code Online (Sandbox Code Playgroud)

默认情况下,它是false.如果未设置该标志,则不会传输cookie,并且会忽略响应中的cookie标头.

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

  • @XiroX正如@Mahes在问题`withCredentials`的评论中发现的那样,你的代码实际拼写错误,这可能就是你没有收到cookie的原因. (2认同)

Flo*_*ine 6

以前也遇到过这种情况,我可以说这很愚蠢。

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

这意味着虚拟机的日期通常比主机或您使用的任何客户端晚几天(或更多)。

因此,当服务器设置 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
Run Code Online (Sandbox Code Playgroud)


小智 5

我刚遇到这个问题,我的解决方案是添加 cookie 的路径,所以添加 cookie 时必须使用:

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

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

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

  • 不能对此表示足够的支持,这让我陷入了一个循环,试图做完全相同的事情,通过 javascript 设置 cookie,设置 withCredentials = true,但直到我设置了 cookie 上的路径,我的浏览器(chrome)才不会传输该 cookie (2认同)