javascript - 如何检测 sessionStorage 是否会死?
问题描述
显然,我们能够将用户数据存储在sessionStorage
. 此外,我们可以观察到以下变化sessionStorage
:
window.addEventListener('storage', function(e) {
但是,如果我们还向我们的数据库发送一些信息,并且当用户完成我们的网站时我们需要执行一些重要操作,并且他正在关闭我们网站的所有打开的浏览器选项卡,并且sessionStorage
快要死了怎么办?
有事件onbeforeunload
,但它不适合我们的问题,因为同一网站的许多标签可以同时打开,我们不能确定它是最后一个。
所以问题是——我们能检测到什么时候sessionStorage
会死吗?
解决方案
目标是检测访问特定站点的最后一个选项卡何时关闭。
假设每个选项卡都与唯一的会话 ID 相关联,则以下方法应该有效:
页面加载时:
- 获取会话 ID
- 从 localStorage 检索活动会话 ID 数组
- 如果数组中不存在会话 ID,则添加它
- 将数组存储到 localStorage
页面卸载时:
- 从 localStorage 检索活动会话 ID 数组
- 从数组中查找并删除当前会话 ID
- 将数组更新到 localStorage
- 如果数组为空,请执行“最后一个标签关闭”操作
浏览器崩溃怎么办?
当浏览器崩溃时,此方案无法处理。在这种情况下,永远不会检测到页面卸载,并且 localStorage 永远不会清除其活动会话 ID 数组。
应对崩溃的一种方法是为每个存储的会话 ID 设置一个时间戳,然后删除旧的会话 ID。
let sessionArr = [
{ sessionId, timestamp },
...
]
推荐阅读
- javascript - 为什么我的当我尝试移动它时元素开始颤抖?
- java - 加 2 个数字 == android studio
- java - 使用 Spring Boot 默认配置通过 JDBC 语句执行 DDL 时出错
- lua - {LUA} 如何在脚本中触发另一个脚本?
- javascript - Firebase云函数中仅知道childId时如何检索parentId
- spring - 如何在 CXF 的 ContainerRequestFilter 中注入 ResourceInfo
- android - 在android中连接到xmpp服务器
- android - 弹性搜索结果在空格后开始新的搜索
- python-3.x - 如何从套接字(AF_INET6、SOCK_RAW、IPPROTO_ICMPv6)的原始字节串创建 ICMPv6 scapy 对象?
- node.js - 如何以编程方式通过标准输入将变量传递给 cli 命令?