销毁 cookie NodeJs

Posted

技术标签:

【中文标题】销毁 cookie NodeJs【英文标题】:Destroy cookie NodeJs 【发布时间】:2015-03-14 18:10:35 【问题描述】:

我正在使用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);

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

任何建议都将不胜感激。

【问题讨论】:

在您链接的模块中似乎没有针对它的方法,但setting the cookie to expire in the past (expires: new Date(0)) 应该使 cookie 无效。 感谢@JonathanLonowski,它提供了帮助。 【参考方案1】:

对于 webapp,您可以将 cookie 设置为:

res.cookie("key", value);

并删除 cookie:

res.clearCookie("key");

别忘了:

res.end()

避免网络请求挂起。

【讨论】:

这是更好的解决方案。但是,方式不同吗?通过不使用 cookie。它只是一个名为cookiekey 来响应。我需要获得更安全的身份验证方法。 这是真实的并且有据可查:expressjs.com/en/api.html#res.clearCookie 这不会向客户端发送任何内容,因此客户端不会删除他们的 cookie。 @Michael 这只是设置了一个标题。您仍然必须使用 res.end() 或类似名称发送响应。然后发送响应并清除 cookie。 对于那些使用 Express 和/或 Nest for REST API 的人,请确保您在注销路由中接收到响应对象,调用 request.session.destroy(() => ...) 并在传入的回调函数中调用 @上面的987654329@方法,然后一定要调用response.end(),避免web请求挂起或者超时。【参考方案2】:

根据 HTTP 规范,无法删除 cookie。为了有效地“删除” cookie,您将过期日期设置为过去的某个日期。本质上,这将为您带来以下结果(根据 cookie 模块文档):

cookies.set('testtoken', maxAge: 0);

或者根据HTTP规范:

cookies.set('testtoken', expires: Date.now());

两者都应该有效。您可以将 Date.now() 替换为 new Date(0) 以获得非常旧的日期。

【讨论】:

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

虽然另一个答案是正确的,但从 express.js 网络应用程序中删除 cookie 是通过调用以下方法完成的:

res.clearCookie("key");

但有一个警告!

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

【讨论】:

恐怕我听不懂你的句子?删除 cookie 不会更新选项?但是选项需要和设置的cookie一致,否则cookie不会被移除。 @Manwal 没关系。关键是您必须包含相同的选项。如果您“错过”一个选项,则不会删除 cookie。 这是不正确的。使用 clearCookie 时不需要传递任何选项。 我的立场是正确的,尽管在我的情况下,即使没有传递任何选项,我也能够清除 cookie。 (PS:我会删除我的反对票,但除非你编辑你的答案,否则我不能这样做) @Incinerator 并非所有浏览器。 :) 已编辑!【参考方案4】:

我将它与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('/');
);

【讨论】:

嘿,你为什么要检查if (!cookie.hasOwnProperty(prop)) continue; ?那个cookie不会来自哈希本身吗?那么为什么要在哈希为您提供密钥然后删除密钥时检查它 对我来说,expires 选项抛出错误,所以我将maxAge 添加到 0【参考方案5】:

如果我们只是尝试从响应中清除任何 http cookie [使用res.clearCookie("key")] 来删除它,那肯定是行不通的。实际上,要删除http cookie,域和路径非常重要。

域和路径定义了 cookie 的范围。从表面上看,它们本质上是告诉浏览器 cookie 属于哪个网站。 使用 ; 发送相同的 cookie 值附加过期也是一个坏主意,因为您希望内容被销毁,但这不会发生。

最好的办法是通过将值设置为空并包含过期字段来使 cookie 无效,如下所示:

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: '/' );

希望对你有帮助!!!

【讨论】:

就我而言,我还需要添加域选项。谢谢【参考方案6】:

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

res.setHeader('set-cookie', 'mycookie=; max-age=0');

优点:

只使用节点 简单易懂

学分:@andy

【讨论】:

【参考方案7】:

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

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

res.cookie('cookieName', '', 
      domain: 'https://my.domain.com',
      maxAge: 0,
      overwrite: true,
    );

【讨论】:

【参考方案8】:

在生产环境中使用 SSL 时,您需要指定域。这个域必须和那个用来存储cookie的域对应!

例如:

res.clearCookie('sid', domain: ".somedomain")

【讨论】:

【参考方案9】:

我已经尝试了所有解决方案,但在我找到这个之前没有一个有效。

    我这样设置我的 cookie:
res.writeHead(200, 
   "Set-Cookie": `token=$accessToken; HttpOnly; path=/`,
   "Access-Control-Allow-Credentials": "true",
);

res.end();
    然后像这样销毁它:
res.writeHead(200, 
    "Set-Cookie": `token=; HttpOnly; path=/; max-age=0`,
);
res.end();

【讨论】:

【参考方案10】:

从服务器销毁 cookie 的另一种方法。只需将负整数设置为 maxAge。还有一件事要记住,不要忘记设置何时设置或销毁 cookie 的路径。

【讨论】:

【参考方案11】:

最好的方法

在设置类似标记之前,您应该先删除它 像这样

res.clearCookie('token');
res.cookie('token',token,  maxAge: 900000, httpOnly: true );

【讨论】:

以上是关于销毁 cookie NodeJs的主要内容,如果未能解决你的问题,请参考以下文章

php7中如何设置COOKIE和销毁COOKIE

java中cookie的创建和销毁

vue中js-cookie中怎么销毁所有的cookie

NodeJsNodeJs安装,编译目录过滤

如何在 WordPress 中设置、获取和销毁 cookie?

Codeigniter - 注销链接不起作用 - 会话和 cookie 未销毁