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

标签 javascript jquery

我有一个基于登录的网站,我想在用户离开该网站时将其注销(即关闭浏览器或关闭选项卡)。我知道这无论如何都不是万无一失的,但我还是想尽我所能地进行设置。

我正在使用以下代码:

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

并且 logout.php 只是取消 session 设置。

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

最佳答案

我只是想让大家知道我是如何解决这个难题的。

最后,我放弃了 Javascript 中的 unload 函数的想法,转而采用 JS/PHP 组合解决方案。

当用户在网站上时,此 AJAX 每 10 秒触发一次:

$.ajax({
    type: "POST",
    url: "scripts/resession.php"
});

目标 PHP 更新数据库中用户的 last_active 统计信息:

<?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 秒的时间他们可以回来并仍然登录 - 但这实际上有其好处,因为可能会出现用户忘记做某事并回来的情况关闭后立即关闭,因此在这种情况下必须再次登录对他们来说会很麻烦。

关于javascript - 当用户在卸载时注销时,他们也会在重新加载时注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35460296/

相关文章:

javascript - 不影响嵌套 Accordion jquery 的自定义样式 - 如何修复

javascript - 数据表流水线和固定列

javascript - 从 jQuery 中作为属性的函数访问数据属性

javascript - 将加载的内容限制在 div 中

jquery - 来自 jquery 的 sourceMappingURL 在 apache 中生成 404 错误

Javascript : natural sort of alphanumerical strings

javascript - 有趣的项目——你能钩住闪光灯吗?

javascript - 在 FullCalendar 中更改日期背景颜色

javascript - jqueryui 的 "Fold"效果是唯一有效的效果

javascript - jquery通过单击图标下拉搜索框