如何检测网站上用户会话的结束以删除会话令牌
How to detect the end of a user's session on website to delete session token
对于不想在我网站上的会话之间被记住的用户,我生成了一个临时会话令牌并将其作为 cookie 发送给客户端,以便他们在我网站上的网页之间被记住。
cookie 在会话结束时自动过期,因为这是默认设置,但我如何检测会话服务器端的结束?
我想在用户会话结束时从我的数据库中删除会话令牌,如果他们再次登录,我想生成一个新的会话令牌。
"session"中的"cookie-expires-at-end-of-session"概念其实只有在浏览器上才知道。来自维基百科:
A session cookie, also known as an in-memory cookie or transient
cookie, exists only in temporary memory while the user navigates the
website.[13] Web browsers normally delete session cookies when the
user closes the browser.
所以如果用户连续几天打开浏览器(像我一样),这可能仍然会留下一个 cookie 逗留很长时间。
实现您想要的效果的一种方法是让网页向服务器发送 "heart-beat",例如使用 javascript 中的 setTimeout
每 10 秒访问某个 URL,并传递他的 "session" 的一些唯一标识(在您想要的意义上,不是 cookie-session ).如果心跳停止,您就知道您的网页已关闭,或者用户离开了它等,您可以立即清理服务器端状态。
更详细地说,"heartbeat URL" 将简单地维护一个活动会话列表。每次访问 URL 都会更新指定会话的最后一个 activity 的时间戳(例如 http://..../heartbeat?id=12345
)。这样你就有了所有活动会话的 "most recent time stamps" 列表。然后,一个单独的清理线程将 运行 偶尔在该列表上清理那些在最后 (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(加上您的服务器响应延迟)。
对于不想在我网站上的会话之间被记住的用户,我生成了一个临时会话令牌并将其作为 cookie 发送给客户端,以便他们在我网站上的网页之间被记住。
cookie 在会话结束时自动过期,因为这是默认设置,但我如何检测会话服务器端的结束?
我想在用户会话结束时从我的数据库中删除会话令牌,如果他们再次登录,我想生成一个新的会话令牌。
"session"中的"cookie-expires-at-end-of-session"概念其实只有在浏览器上才知道。来自维基百科:
A session cookie, also known as an in-memory cookie or transient cookie, exists only in temporary memory while the user navigates the website.[13] Web browsers normally delete session cookies when the user closes the browser.
所以如果用户连续几天打开浏览器(像我一样),这可能仍然会留下一个 cookie 逗留很长时间。
实现您想要的效果的一种方法是让网页向服务器发送 "heart-beat",例如使用 javascript 中的 setTimeout
每 10 秒访问某个 URL,并传递他的 "session" 的一些唯一标识(在您想要的意义上,不是 cookie-session ).如果心跳停止,您就知道您的网页已关闭,或者用户离开了它等,您可以立即清理服务器端状态。
更详细地说,"heartbeat URL" 将简单地维护一个活动会话列表。每次访问 URL 都会更新指定会话的最后一个 activity 的时间戳(例如 http://..../heartbeat?id=12345
)。这样你就有了所有活动会话的 "most recent time stamps" 列表。然后,一个单独的清理线程将 运行 偶尔在该列表上清理那些在最后 (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(加上您的服务器响应延迟)。