【问题标题】:How to check Node session cookie expiration from browser如何从浏览器检查节点会话 cookie 过期
【发布时间】:2014-04-15 13:34:29
【问题描述】:

我们使用 Node + Connect 来管理我们的应用程序的会话,这是一个使用 Backbone.js 构建的单页应用程序 (SPA)。我正在尝试编写一些代码,这些代码将从客户端检查会话是否仍然有效。我知道我可以在 Node 本身中完成,但由于这是一个 SPA,我需要能够完全在客户端完成。

我的第一个想法是使用 jQuery 读取 connect.sid cookie,如果它不存在,则意味着会话已过期。不幸的是,该会话 cookie 受到 HttpOnly 标志的保护,这是有充分理由的。我不想禁用它。

我的第二个想法是在每次写入 connect.sid cookie 时编写一个第二个并行 cookie。第二个 cookie 将只存储会话 cookie 的过期日期,并将 HttpOnly 设置为 false,以便客户端可以读取它。

所以我的问题是,我该如何编写第二个 cookie, 是否有更好的解决方案可以从浏览器中检测会话过期状态?

我知道如何使用 Node 编写 cookie,但我不确定将代码放在哪里,以便每次 Connect 写入主 connect.sid 会话 cookie 时它都会触发。此外,我想读取会话 cookie 的过期日期,以便将其写入并行 cookie。

更新:明确地说,我不想阅读会话的到期日期。我知道 JS 无法访问 cookie 的过期日期。我只是想看看 cookie 是否存在,因为它只有在它有效时才会存在,因此它的缺失对我来说是足够的数据。

【问题讨论】:

    标签: javascript node.js backbone.js cookies connect


    【解决方案1】:

    在 cmets 澄清后更新

    在会话中间件旁边添加另一个中间件。下面的摘录假定为 express,但如果您使用不带 express 的 connect,您应该能够进行相应的解释。

    app.use(connect.session(sessionOptions));
    app.use(function (req, res, next) {
       res.cookie("sessionIsAlive", "1", {
         //just make sure this matches your expiration time of the real session cookie
         expires: new Date(Date.now() + 900000),
         httpOnly: false
      });
      next();
    });
    

    然后您可以通过浏览器中的 javascript 检查是否存在。仅供参考,连接会在每个响应上写入一个更新过期时间的新 cookie。这就是“N 分钟不活动后过期”行为的实现方式。

    【讨论】:

    • 如前所述,我需要一个客户端解决方案,而不是服务器端解决方案 res.cookie()。至于手动编写 cookie,我可以很好地处理这部分,但我不知道我可以在哪里挂钩该代码,以便它将第二个 cookie 写入 Node 将写入会话 cookie 的所有地方。
    • 不,你的问题是问你如何设置第二个cookie,你在服务器端使用httpOnly false 进行设置,然后检查它在浏览器中是否存在。
    • 好的,对不起,如果我不是更清楚。我知道如何用 Node 编写 cookie,这部分很简单。我不知道在哪里放置该代码,以便每次 Connect 尝试编写 connect.sid 会话 cookie 时都会触发它。
    • 彼得,非常感谢。我会试试看,然后回复你。
    猜你喜欢
    • 2014-10-17
    • 2013-07-18
    • 2011-04-21
    • 2014-07-20
    • 2015-08-12
    • 2018-04-27
    • 2020-01-20
    • 2015-11-27
    • 2014-02-21
    相关资源
    最近更新 更多