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

Javascript 使用CORS XHR时浏览器不发送回cookie,javascript,node.js,express,cors,Javascript,Node.js,Express,Cors,编辑-使用Chrome web inspector查看cookie,无论cookie的过期值是多少,浏览器都会将其设置为会话cookie,并根据请求将其删除 我正在使用Node.js和Express为我所教的一个类构建一个CORS示例 但是,尽管cookie是从服务器设置的,但它们不会在以下请求中被发送回服务器。这几乎意味着我不能使用任何琐碎的会话管理器 你知道我错过了什么吗?为什么浏览器不将域设置的cookie发送回该域?这不应该自动发生吗 编辑-一些代码示例: 设置XHR请求: var xh

编辑-使用Chrome web inspector查看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
中间件,它们做同样的事情,没有明显的差异

至于情景:

  • 使用XHR发出CORS请求
  • 服务器设置一个成功发送回客户端的cookie(快速会话cookie)
  • 下一个XHR请求不会将该cookie发送回服务器,因此express无法识别用户,因此会创建一个新的会话cookie等等 这是以前的事,我可以说这很愚蠢

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

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

    因此,当服务器设置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
    

    除了我读到的内容之外,我对这方面一无所知,但根据XHR对象上的“withCredentials”属性,需要设置:

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


    编辑-我发誓我读了你的问题好几遍,但我完全没有听到你提到国旗。很抱歉但是,由于这不是完全的浪费,我还要提到,您的服务器需要在响应头中将“访问控制允许凭据”标志设置为
    true
    ,并将“访问控制允许来源”设置为您当前的协议+主机+端口。

    ,事实证明,浏览器设置阻止了第三方cookie(Chrome>设置>高级设置>隐私>内容设置>阻止第三方cookie和网站数据)。解锁解决了问题

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

    document.cookie='cookieName=cookieValue;路径=/'

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


    PS:您还需要
    xhr.withCredentials=true如果您使用的是跨域请求

    代码胜过千言万语。:-)显示您的代码设置所有CORS头、设置cookie等。您是否为服务器使用虚拟机?仅供澄清:您指的是服务器在进行跨源调用的域中设置的cookie,对吗?另外,特别是关于“忽略凭据”标志的部分,关于用户代理如何强制使其始终为
    true
    看起来您的代码中有输入错误。应为xhr.withCredentials=true;not xhr.widthCredentials=true;如果您阅读了以下问题:
    包括启用withCredentials标志
    @FlorianMargaine oops:-),那么我将扩展答案anyway@XiroX正如@Mahes在问题
    的注释中所发现的,您的代码中实际上拼写错误,这可能就是你没有收到发送的cookies的原因。@XiroX你检查了你服务器上的日期了吗?是的-这不是日期问题-服务器发送的日期很好。哈哈,类似的事情曾经发生在我身上。我很高兴我手边没有棒球棒。这并没有真正的帮助,因为你无法控制用户的设置。当然,在这种情况下,因为他在教一门课,他可以告诉他的学生禁用设置,但在现实世界中,这几乎没有什么帮助。这还不够,这让我陷入了一个循环,试图做完全相同的事情,通过javascript设置cookie,设置为credentials=true,但是,在我设置了cookie的路径之前,我的浏览器(chrome)不会传输cookie