探讨页面长时间未操作后,自动跳转登录页,该怎么操作?

探讨页面长时间未操作后,自动跳转登录页

我们先了解前端轮询查询

轮询是一种由客户端(如浏览器)主动发送请求,定期从服务器获取数据的方式。客户端会按照设定的时间间隔发送请求,然后服务器响应请求并返回最新的数据。

常用场景如聊天应用、股票行情、在线游戏等。

实现如下:

setInterval(function() {
  // 发送HTTP请求到服务器
  fetch('/api/data')
    .then(response => response.json())
    .then(data => {
      // 更新页面内容
      console.log(data);
    })
    .catch(error => {
      console.error('Error:', error);
    });
}, 5000); // 每5秒执行一次

那我们可以用这个方法实现用户长时间未操作后跳转登录页面

前端部分:

  1. 设置定时器
  2. 用户活动监听
  3. 清除定时器

后端部分:

  1. 会话管理
  2. 更新会话状态
  3. 检查会话有效性

前端代码实践如下:

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);
});

当然了,最后还是根据自己的项目进行优化

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值