如何检测网站上用户会话的结束以删除会话令牌

时间:2016-05-11 08:18:22

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

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

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

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

1 个答案:

答案 0 :(得分:2)

"会话"概念在" cookie-expires-at-end-of-session"实际上只在浏览器上知道。来自维基百科:

  

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

因此,如果用户连续几天打开浏览器(就像我一样),这可能会让cookie长时间停留。

实现您想要的目标的一种方法是让网页发送一个"心跳"到服务器,例如在javascript中使用setTimeout每10秒访问一个特定的URL,并传递他的" session" (在你想要的意义上,而不是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(加上服务器响应延迟)。