You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AJAX场景下登录超时未跳转至锁定页面,仅插入内容问题

实时检测登录时长并自动锁定页面的解决方案

你的问题核心在于:当前的PHP代码是服务器端在页面请求时仅执行一次,只有页面刷新或首次加载才会触发,没法实时监控用户的活跃状态。要实现无需刷新就能检测超时并跳转,得结合前端JS的实时监听和后端的安全验证。

1. 修正现有PHP代码的逻辑问题

首先你的URI判断有个小bug:$_SERVER['REQUEST_URI'] == '/account/Dashboard' || '/account/Dashboard/?Login=Success' 写法不对,第二个条件是字符串,在PHP里会被解析为true,导致不管当前URI是什么都会执行代码。应该改成数组匹配的方式:

<?php
$targetUris = ['/account/Dashboard', '/account/Dashboard/?Login=Success'];
if (in_array($_SERVER['REQUEST_URI'], $targetUris)) {
    $uid = $userRow['user_id'];
    // 初始化用户最后活跃时间到Session,用于后端验证
    $_SESSION['last_active'] = time();
?>
<div id="auto-lock"></div>

2. 前端JS实现实时活跃监控

我们需要监听用户的鼠标移动、键盘输入等活跃行为,重置超时计时器;一旦超过10秒无操作,就调用后端接口标记锁定并跳转页面:

<script>
// 设置超时时间:10秒(单位:毫秒)
const LOCK_TIMEOUT = 10 * 1000;
let lockTimer;

// 重置计时器的函数
function resetLockTimer() {
    // 清除之前的计时器
    clearTimeout(lockTimer);
    // 重新启动超时倒计时
    lockTimer = setTimeout(() => {
        // 调用后端锁定接口
        fetch('/account/auto-lock.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            body: `uid=<?php echo $uid; ?>`
        })
        .then(res => res.json())
        .then(data => {
            if (data.success) {
                // 跳转至锁定页面
                window.location.href = '/account/Locked';
            }
        });
    }, LOCK_TIMEOUT);
}

// 监听用户活跃事件
document.addEventListener('mousemove', resetLockTimer);
document.addEventListener('keydown', resetLockTimer);
document.addEventListener('click', resetLockTimer);

// 页面加载时启动计时器
window.addEventListener('load', resetLockTimer);
</script>
<?php } ?>

3. 后端auto-lock.php的安全处理

为了防止前端被绕过,后端需要验证用户身份并记录锁定状态:

<?php
session_start();

// 验证用户是否合法登录
if (!isset($_SESSION['user_id']) || $_SESSION['user_id'] != $_POST['uid']) {
    echo json_encode(['success' => false, 'msg' => '非法请求']);
    exit;
}

// 标记用户为锁定状态(可以同步到数据库)
$_SESSION['is_locked'] = true;
// 可选:调用你的业务逻辑方法更新数据库
// $auth_user->auto_timeout(time(), $_SESSION['user_id']);

echo json_encode(['success' => true]);
?>

额外注意事项

  • AJAX场景兼容:如果页面有AJAX交互,记得在AJAX请求成功后也调用resetLockTimer(),因为用户操作AJAX也算活跃行为。
  • 后端页面验证:在仪表盘等敏感页面的开头,要检查$_SESSION['is_locked']状态,防止用户直接通过URL绕过前端跳转。
  • 超时时间调整:10秒只是测试用,实际生产环境建议设置为15分钟或更合理的时长。

内容的提问来源于stack exchange,提问作者JamesBond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:29:32