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

一、前言

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

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

三、参考资料

相关推荐
用户461169657282 分钟前
网站 HTTPS 不稳定?证书排查指南
前端
n876513 分钟前
Playwright Java WEB UI 自动化实现框架与逻辑
java·前端·ui
keyipatience15 分钟前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
xifangge202544 分钟前
基于 JavaScript 实现 CNC 数控切削参数与螺纹公差纯前端核算引擎
开发语言·前端·javascript
wangruofeng1 小时前
2026 Web 技术选型指南,AI 时代如何选择适合项目的技术栈
前端·aigc·ai编程
honkun61 小时前
vue 表格组件 vxe-table 修改滚动条样式,修改滚动条样式,统一宽度、颜色与自动隐藏
前端·javascript·vue.js
爱勇宝2 小时前
研究数字孪生的这半年,做了个 Demo,也有了一些新想法
前端·程序员
不可能片场2 小时前
工程实践 一个缓存把选片从十分钟压到一分钟
前端·electron
前端小万2 小时前
探索副业五个月,最终以放弃告终
前端·后端·面试
FRing032 小时前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式