首页 > 解决方案 > 如何检测 sessionStorage 是否会死?

问题描述

显然,我们能够将用户数据存储在sessionStorage. 此外,我们可以观察到以下变化sessionStorage

window.addEventListener('storage', function(e) { 

但是,如果我们还向我们的数据库发送一些信息,并且当用户完成我们的网站时我们需要执行一些重要操作,并且他正在关闭我们网站的所有打开的浏览器选项卡,并且sessionStorage快要死了怎么办?

有事件onbeforeunload,但它不适合我们的问题,因为同一网站的许多标签可以同时打开,我们不能确定它是最后一个。

所以问题是——我们能检测到什么时候sessionStorage会死吗?

标签: javascriptsession-storage

解决方案


目标是检测访问特定站点的最后一个选项卡何时关闭。

假设每个选项卡都与唯一的会话 ID 相关联,则以下方法应该有效:

页面加载时:

  1. 获取会话 ID
  2. 从 localStorage 检索活动会话 ID 数组
  3. 如果数组中不存在会话 ID,则添加它
  4. 将数组存储到 localStorage

页面卸载时:

  1. 从 localStorage 检索活动会话 ID 数组
  2. 从数组中查找并删除当前会话 ID
  3. 将数组更新到 localStorage
  4. 如果数组为空,请执行“最后一个标签关闭”操作

浏览器崩溃怎么办?

当浏览器崩溃时,此方案无法处理。在这种情况下,永远不会检测到页面卸载,并且 localStorage 永远不会清除其活动会话 ID 数组。

应对崩溃的一种方法是为每个存储的会话 ID 设置一个时间戳,然后删除旧的会话 ID。

let sessionArr = [
  { sessionId, timestamp },
  ...
]

推荐阅读