对于不希望在我的网站上的会话之间被记住的用户,我会生成一个临时会话令牌并将其作为cookie发送给客户端,以便在我的网站上的网页之间记住它们。
Cookie会在会话结束时自动过期,因为这是默认设置,但是如何检测会话服务器端的结束?
我想从我的数据库中删除用户会话结束时的会话令牌,然后再次登录我想生成一个新的会话令牌。
答案 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(加上服务器响应延迟)。