销毁cookie NodeJs

Man*_*wal 32 cookies node.js

我正在使用Cookies模块来设置cookie.这是我的代码:

var options = {
    maxAge: ALMOST_ONE_HOUR_MS,
    domain: '.test.com',
    expires: new Date(Date.now() + ALMOST_ONE_HOUR_MS)
};
var value = userInfo.token;
cookies.set("testtoken", value, options);
Run Code Online (Sandbox Code Playgroud)

但在文档中我还没有找到如何销毁这个cookie.

任何建议将不胜感激.

vas*_*shu 85

对于webapp,您可以将响应中的cookie设置为:

res.cookie("key", value);
Run Code Online (Sandbox Code Playgroud)

并删除co​​okie:

res.clearCookie("key");
Run Code Online (Sandbox Code Playgroud)

  • 这是真实的,并在此处有详细记录:http://expressjs.com/en/api.html#res.clearCookie (4认同)
  • 这不会将任何内容发送回客户端,因此客户端不会删除他们的 cookie。 (3认同)

Roe*_*den 20

根据HTTP规范无法删除cookie.要有效地"删除"cookie,请将过期日期设置为过去的某个日期.从本质上讲,这将导致以下内容(根据cookie模块文档):

cookies.set('testtoken', {maxAge: Date.now()});
Run Code Online (Sandbox Code Playgroud)

或者根据HTTP规范:

cookies.set('testtoken', {expires: Date.now()});
Run Code Online (Sandbox Code Playgroud)

两者都应该有效.您可以替换Date.now()new Date(0)一个真正的老日期.

  • 这不应该是“maxAge: 0”吗?“代表 Date.now() 到期的毫秒数的数字” https://github.com/pillarjs/cookies (3认同)
  • @vashishatashu我不确定你想说的是什么."销毁"cookie或将其过期日期设置为已经过去的日期之间没有区别.这是完全相同的事情.阅读HTTP规范以获取有关cookie机制的详细信息,或使用您喜欢的语言"销毁"cookie并查看开发工具中的标题(请注意Set-Cookie). (2认同)
  • 小心“new Date(0)”。某些实现可能会将其视为特殊情况并且行为不可预测。我刚刚确认使用 Date(0) 和 `simple-cookie` stringify() 会创建一个会话 cookie,而不是删除它。在这种情况下,“Date.now()”或“new Date()”工作正常,“new Date(1)”也可以正常工作,但不能为 0。 (2认同)

Jes*_*und 8

虽然另一个答案是正确的,但是通过调用以下方法来从express.js webapp中删除cookie:

res.clearCookie("key");

但有一个警告!

您的cookie选项(过期除外)需要与设置时相同.否则浏览器不会删除cookie.所以使用相同的域名,安全设置等(参考:https://expressjs.com/en/4x/api.html#res.clearCookie)

  • @Incinerator 不是所有浏览器。:) 编辑! (2认同)

San*_*ers 7

我正在使用这个cookie-parser模块:

router.get('/logout', function(req, res){
    cookie = req.cookies;
    for (var prop in cookie) {
        if (!cookie.hasOwnProperty(prop)) {
            continue;
        }    
        res.cookie(prop, '', {expires: new Date(0)});
    }
    res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)


小智 7

要删除任何http cookie,如果我们只是尝试从响应[使用res.clearCookie("key")] 清除它,它绝对不会起作用.实际上,要删除http cookie,域和路径都非常重要.

域和路径定义cookie的范围.从表面上看,他们基本上会告诉浏览器cookie属于哪个网站.发送相同的cookie值; expires附加也是一个坏主意,因为你想要销毁内容,但这不会发生.

最好的想法是通过将值设置为空来使cookie失效并包含一个expires字段,如下所示:

res.cookie("key","empty the key content", {expires:old date, domain:'.example.com', path:'/'});

res.cookie("token", "", { expires: new Date(0),domain:'.test.com', path: '/' });
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!!!

  • 就我而言,我还需要添加域选项。谢谢 (2认同)

Mar*_*ing 7

几天前我遇到了同样的问题。和朋友讨论后,我认为这是最好的解决方案。

res.setHeader('set-cookie', 'mycookie=; max-age=0');
Run Code Online (Sandbox Code Playgroud)

好处:

  • 只使用节点
  • 简单易懂

学分:@andy


小智 5

cookie-parser也在使用,上面的答案引导我找到解决方案。在我的情况下,我也需要添加overwrite: true,否则添加了新的 cookie 密钥。

所以我的最终解决方案如下:

res.cookie('cookieName', '', {
      domain: 'https://my.domain.com',
      maxAge: 0,
      overwrite: true,
    });
Run Code Online (Sandbox Code Playgroud)