【问题标题】:How to detect the end of a user's session on website to delete session token如何检测网站上用户会话的结束以删除会话令牌
【发布时间】:2016-05-11 08:18:21
【问题描述】:

对于不想在我网站上的会话之间被记住的用户,我会生成一个临时会话令牌并将其作为 cookie 发送给客户端,以便在我网站上的网页之间记住他们。

cookie 在会话结束时自动过期,因为这是默认设置,但我如何检测会话服务器端的结束?

我想在用户会话结束时从我的数据库中删除会话令牌,然后如果他们再次登录,我想生成一个新的会话令牌。

【问题讨论】:

  • 真的需要在服务器中存储会话吗?如何使用具有已知密钥(如用户 ID 或用户名)和盐的非对称加密(如 sha1)生成会话令牌,并且可能是一个时间。对于每个请求,您都可以验证会话令牌的有效性。您无需在服务器中存储和维护会话

标签: node.js database npm token session-cookies


【解决方案1】:

“cookie-expires-at-end-of-session”中的“session”概念实际上只有浏览器知道。来自维基百科:

会话 cookie,也称为内存 cookie 或瞬态 cookie,仅在用户导航时存在于临时内存中 网站。[13] Web 浏览器通常会在 用户关闭浏览器。

因此,如果用户连续数天(如我)保持浏览器打开,这可能仍会使 cookie 逗留很长时间。

实现您想要的一种方法是让网页向服务器发送“心跳”,例如在javascript中使用setTimeout每10秒访问一个特定的URL,并传递他的“会话”的一些唯一标识(在你想要的意义上,而不是cookie会话)。如果心跳停止,您就知道您的网页已关闭,或者用户离开它等,您可以立即清理服务器端状态。

更详细地说,“心跳 URL”只是维护一个活动会话列表。对该 URL 的每次访问都会更新指定会话的最后一个活动的时间戳(例如http://..../heartbeat?id=12345)。这样,您就有了所有活动会话的“最新时间戳”列表。然后,一个单独的清理线程会不时在该列表上运行一次,以清理那些在过去 (10...) 秒内未更新的会话。

例如(使用 JQuery 进行 URL 访问,可以只使用 XMLHttpRequest...)

<script>
function heartBeat() {
    setTimeout(function(){ 
      $.get("heartBeat?id="+mySessionId, function( data ) {
         // you may want to add sanity checks here, e.g. what with invalid session ids?
         heartBeat();   // next call to heartBeat after OK response
      }
    }, 10000);
}
heartBeat();  // first call to heartBeat
</script>

这将每 10 秒调用一次您的服务器 URL(加上您的服务器响应延迟)。

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 2013-10-17
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多