销毁 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。它只是一个名为cookie
的key
来响应。我需要获得更安全的身份验证方法。
这是真实的并且有据可查: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的主要内容,如果未能解决你的问题,请参考以下文章