我有一个基于登录的网站,我想在用户离开网站时将用户退出(即关闭浏览器或关闭标签页)。我知道这绝不是万无一失的,但我想尽我所能地设置它。
我使用以下代码:
$(window).unload(function() {
//Send an Ajax request to logout.php
$.ajax({
type: "POST",
url: "scripts/logout.php"
})
});
logout.php
只是取消会话。
这在关闭网站时工作正常,但它工作得太好了,这意味着它在重新加载页面或单击站点内链接时也会触发。如何防止此行为,即检查用户的操作是否实际关闭浏览器或导航离开网站,而不是重新加载或访问其他网站部分?
答案 0 :(得分:0)
我只是想让大家知道我是如何解决这个难题的。
最后,我放弃了Javascript中unload
函数的想法,并寻求组合的JS / PHP解决方案。
当用户在网站上时,此AJAX每10秒触发一次:
$.ajax({
type: "POST",
url: "scripts/resession.php"
});
目标PHP更新数据库中用户的last_active
stat:
<?php
session_start();
include('../includes/db.php');
if(isset($_SESSION['isloggedin'])){
$_SESSION['last_active']=time();
mysql_query("update users set last_active='$_SESSION[last_active]' where id='$_SESSION[user_id]' ");
}
?>
在网站上打开用户专用页面时,我们只需检查用户是否在过去20秒内处于活动状态。如果没有,这意味着他们已经离开了网站,我们将其注销并重定向到登录页面:
if(isset($_SESSION['isloggedin'])){
$result = mysql_query("select last_active from users where id='$_SESSION[user_id]' ");
$lainfo = mysql_fetch_assoc($result);
//if more than 20s of inactivity, that means our user has left the site in the meanwhile and they should be logged out
if($lainfo['last_active'] + 20 < time()){
unset($_SESSION['isloggedin']);
unset($_SESSION['user_id']);
unset($_SESSION['last_active']);
header("location:welcome.php");
exit;
}
}
它并不理想,因为它们可以在10-20秒内回来并且仍然可以登录 - 但实际上它有其特权,因为可能存在用户的情况忘记做某事并在关闭后立即回来,所以在这种情况下他们必须再次登录会很烦人。