浏览器及标签页关闭时登出的解决方案

一、前言

项目出于安全评测的要求,需要页面在浏览器及其标签页关闭的时候登出,保证每次进入系统都重新登录。 核心处理逻辑有如下几点:

  1. 监听浏览器关闭事件
  2. 关闭时清除本地存储的token
  3. 关闭时调用登出接口保证后端redis中token被清除

通过AI和网络搜索 给出的方案,很快就实现了。但在自测验证过程中,发现有两个费劲周折的问题。

  1. beforeunload 事件在页面刷新时也会触发,而排除是刷新的情况 试了N种方案都不尽人意
  2. 标签页关闭后axios触发的登出请求 会被浏览器取消,后端接收不到。

折腾一波后,最终都解决了,这里记录下解决方案。

二、解决方案

2.1 标签页关闭时登出,但排除刷新的场景

unload事件中增加刷新情况的判断。除了下面代码中时间差的判断方法外,还尝试过performance.navigation等方案,都无效。

javascript 复制代码
let _beforeUnload_time = 0
let _gap_time = 0
window.onbeforeunload = () => {
  _beforeUnload_time = new Date().getTime();
  console.log("beforeUnload_time", _beforeUnload_time);
};

window.onunload = (event) => {
  _gap_time = new Date().getTime() - _beforeUnload_time;
  console.log("gap_time", _gap_time);
if (_gap_time <= 5 || event.altKey) {
    // 执行关闭需要进行的操作,1. 清除本地缓存;2. 发送登出接口
    console.log("xxxxxxx关闭");
  }else{
    console.log("页面刷新");
  }
};

2.2 登出请求,避免被浏览器取消

Fetch的keepalive可以在页面卸载(如用户关闭标签页或跳转到新页面)后,确保请求仍能在后台完成的选项

php 复制代码
fetch('/api/logout', {
  method: 'GET',
  headers: {
    'Authorization': token
  },
  keepalive: true, // 类似 sendBeacon 的行为
});

2.3 浏览器关闭再进入的场景

基于sessionStorage做判断,存储在 sessionStorage 里面的数据在页面会话结束时会被浏览器自动清除。

arduino 复制代码
// 初次进入跳转登录页面
if (!sessionStorage.getItem("entered")) {
  location.hash = "#/login";
  sessionStorage.setItem("entered", "true");
}

三、参考资料

相关推荐
zayzy5 分钟前
前端八股总结
开发语言·前端·javascript
今天减肥吗9 分钟前
前端面试题
开发语言·前端·javascript
Rabbit_QL20 分钟前
【前端UI行话】前端 UI 术语速查表
前端·ui·状态模式
小码哥_常35 分钟前
一文带你吃透Android BLE蓝牙开发全流程
前端
小码哥_常41 分钟前
从“新老交锋”看Retrofit与Ktor
前端
小J听不清1 小时前
CSS 外边距(margin)全解析:取值规则 + 实战用法
前端·javascript·css·html·css3
还是大剑师兰特1 小时前
Stats.js 插件详解及示例(完全攻略)
前端·大剑师·stats
前端小超超1 小时前
Vue计算属性computed:可写与只读的区别
前端·javascript·vue.js
IT_陈寒2 小时前
SpringBoot实战:3个隐藏技巧让你的应用性能飙升50%
前端·人工智能·后端
weixin199701080162 小时前
唯品会商品详情页前端性能优化实战
前端·性能优化