在卸载时将用户注销,他们也会在重新加载时注销

时间:2016-02-17 15:04:07

标签: javascript jquery

我有一个基于登录的网站,我想在用户离开网站时将用户退出(即关闭浏览器或关闭标签页)。我知道这绝不是万无一失的,但我想尽我所能地设置它。

我使用以下代码:

$(window).unload(function() {
    //Send an Ajax request to logout.php
    $.ajax({
        type: "POST",
        url: "scripts/logout.php"
    })
});

logout.php只是取消会话。

这在关闭网站时工作正常,但它工作得太好了,这意味着它在重新加载页面或单击站点内链接时也会触发。如何防止此行为,即检查用户的操作是否实际关闭浏览器或导航离开网站,而不是重新加载或访问其他网站部分?

1 个答案:

答案 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秒内回来并且仍然可以登录 - 但实际上它有其特权,因为可能存在用户的情况忘记做某事并在关闭后立即回来,所以在这种情况下他们必须再次登录会很烦人。