【问题标题】:Destroy cookie NodeJs销毁 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,它提供了帮助。

标签: node.js cookies


【解决方案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】:

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

        1. 我这样设置我的 cookie:
        res.writeHead(200, {
           "Set-Cookie": `token=${accessToken}; HttpOnly; path=/`,
           "Access-Control-Allow-Credentials": "true",
        });
        
        res.end();
        
        1. 然后像这样销毁它:
        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 });
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-07-18
              • 2020-04-27
              • 1970-01-01
              • 2011-01-15
              • 2011-01-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多