探讨页面长时间未操作后,自动跳转登录页
我们先了解前端轮询查询
轮询是一种由客户端(如浏览器)主动发送请求,定期从服务器获取数据的方式。客户端会按照设定的时间间隔发送请求,然后服务器响应请求并返回最新的数据。
常用场景如聊天应用、股票行情、在线游戏等。
实现如下:
setInterval(function() {
// 发送HTTP请求到服务器
fetch('/api/data')
.then(response => response.json())
.then(data => {
// 更新页面内容
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
}, 5000); // 每5秒执行一次
那我们可以用这个方法实现用户长时间未操作后跳转登录页面
前端部分:
- 设置定时器
- 用户活动监听
- 清除定时器
后端部分:
- 会话管理
- 更新会话状态
- 检查会话有效性
前端代码实践如下:
let sessionTimer = null;
const sessionTimeout = 3600000; // 60分钟
function resetSession() {
// 发送请求到后端更新会话状态
fetch('/api/update-session').then(response => {
// 处理响应
});
// 重置定时器
clearTimeout(sessionTimer);
sessionTimer = setTimeout(logoutUser, sessionTimeout);
}
function logoutUser() {
// 重定向到登录页面或执行其他登出逻辑
window.location.href = '/login';
}
// 监听用户活动
document.addEventListener('mousemove', resetSession);
document.addEventListener('keydown', resetSession);
// 设置定时器
sessionTimer = setTimeout(logoutUser, sessionTimeout);
// 清除定时器
window.addEventListener('beforeunload', () => {
clearTimeout(sessionTimer);
});
如果按照上面这么写的话,还是得考虑性能问题:过于频繁发送请求到服务器更新用户状态,可能会对服务器造成不必要的负担。可以在前端通过JavaScript管理活动状态,并在需要时(比如用户长时间不活动后)再与服务器通信。
let sessionTimer = null;
const sessionTimeout = 3600000; // 60分钟
function resetSession() {
// 重置定时器
clearTimeout(sessionTimer);
sessionTimer = setTimeout(logoutUser, sessionTimeout);
}
function logoutUser() {
// 发送请求到后端更新会话状态
fetch('/api/update-session').then(response => {
// 处理响应
});
// 重定向到登录页面或执行其他登出逻辑
window.location.href = '/login';
}
// 监听鼠标和键盘事件
document.addEventListener('mousemove', resetSession);
document.addEventListener('keydown', resetSession);
// 监听页面焦点变化
window.addEventListener('blur', resetSession);
window.addEventListener('focus', resetSession);
// 设置定时器
sessionTimer = setTimeout(logoutUser, sessionTimeout);
// 清除定时器
window.addEventListener('beforeunload', () => {
clearTimeout(sessionTimer);
});
当然了,最后还是根据自己的项目进行优化