原生PHP下如何检测用户非活跃状态?窗口关闭自动登出求助
原生PHP实现用户非活跃检测与窗口关闭自动登出
一、检测用户非活跃状态
用户非活跃状态需要前端+后端配合实现,毕竟PHP是服务端语言,无法直接感知前端用户的操作行为:
- 前端监听交互事件:监听鼠标移动、键盘输入、页面点击等用户操作,每次触发时重置超时定时器,一旦超过设定时长无交互,就调用后端登出接口。
示例代码:let inactivityTimer; // 重置非活跃定时器 function resetInactivityTimer() { clearTimeout(inactivityTimer); // 1800000毫秒=30分钟,可根据需求调整时长 inactivityTimer = setTimeout(logoutUser, 1800000); } // 绑定用户交互事件 window.addEventListener('mousemove', resetInactivityTimer); window.addEventListener('keydown', resetInactivityTimer); window.addEventListener('click', resetInactivityTimer); // 调用后端登出接口 function logoutUser() { fetch('logout.php', { method: 'POST' }) .then(() => window.location.href = 'login.php'); } - 后端处理登出逻辑(logout.php):
session_start(); session_unset(); session_destroy(); exit('已完成登出'); - 后端额外校验:用户每次访问页面时,检查Session中记录的最后活跃时间,若超时直接跳转登录页
session_start(); $timeout = 1800; // 30分钟,单位秒 if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity']) > $timeout) { session_unset(); session_destroy(); header('Location: login.php'); exit; } // 更新最后活跃时间 $_SESSION['last_activity'] = time();
二、解决窗口关闭自动登出的问题
你之前用window.addEventListener('beforeunload', logout)失败,大概率是因为异步请求还没完成,窗口就已经关闭了。可以用navigator.sendBeacon替代,它是浏览器专门为页面卸载场景设计的API,能保证请求在后台完成:
- 前端代码:
window.addEventListener('beforeunload', function() { // 发送登出请求 navigator.sendBeacon('logout.php'); }); - 如果需要传递参数,可用FormData格式:
window.addEventListener('beforeunload', function() { const formData = new FormData(); formData.append('action', 'logout'); navigator.sendBeacon('logout.php', formData); }); - 额外优化:部分浏览器会在标签页切换时触发
beforeunload,可以结合页面可见性API避免误登出:window.addEventListener('beforeunload', function() { if (document.visibilityState === 'hidden') { navigator.sendBeacon('logout.php'); } });
内容的提问来源于stack exchange,提问作者LVC
相关产品推荐
相关产品推荐

