vue多tab页面全部关闭后自动退出登录

业务场景:主项目是用vue写的单页面应用,但是有多开页面的需求,现在需要在用户关闭了所有的浏览器标签页面后,自动退出登录。

思路:因为是不同的tab页面,我只能用localStorage来通信,新打开一个标签页(页面初次装载时),我就往数组中加一个页面,在(页面关闭或刷新等)页面卸载时移除它。这样就只需要在页面装载时(load事件)判断当前是不是刷新页面就可以了,只要是其他来源就直接登出。

2024-01-06 22:23 更新:修改了页面load事件,在页面数组中无页面时,直接去登录页面了,但是还是得把页面加入到页面数组中,那个return没有必要。这个return会导致进入一个新设备(或者清空了浏览器缓存,即清空了currently_open_page)时,未记录当前页,那么页面数组就是空的,导致打开新页面时也直接去登出了。

代码

import store from '@/store'const cache_key = 'currently_open_page'/*** 主方法,外部只要调用此方法就可以了*/
export function mount() {window.addEventListener('beforeunload', function () {const currentRoute = getCurrentPage()delPage(currentRoute)})window.addEventListener('load', function () {// 网页通过“重新加载”按钮或者location.reload()方法加载if (window.performance.navigation.type != 1) {// 如果页面不是刷新进来,不管是任何来源,都可以认为是新进入页面,此时应该就去登录页面if (!getCurrentOpenPageList().length) {store.dispatch('user/logout')}// return}// 添加新的页面const currentRoute = getCurrentPage()addPage(currentRoute)})
}/*** 获取当前的页面(tab页面),目前就用时间值吧* @returns*/
function getCurrentPage() {if (!window._currentPage) {window._currentPage = 'page_' + new Date().getTime()}return window._currentPage
}/*** 获取当前已打开的页面列表* @returns*/
function getCurrentOpenPageList() {const t = window.localStorage.getItem(cache_key)if (t) {return JSON.parse(t)} else {window.localStorage.setItem(cache_key, JSON.stringify([]))return []}
}/*** 往缓存中新增页面*/
function addPage(page) {const list = getCurrentOpenPageList()list.push(page)window.localStorage.setItem(cache_key, JSON.stringify(list))
}/*** 往缓存中移除页面*/
function delPage(page) {const list = getCurrentOpenPageList()const findIndex = list.indexOf(page)if (findIndex != -1) {list.splice(findIndex, 1)}window.localStorage.setItem(cache_key, JSON.stringify(list))
}/*** 清除所有的页面*/
export function clearAllPage() {window.localStorage.setItem(cache_key, JSON.stringify([]))
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios拦截器的使用?

Axios是一个基于Promise的HTTP库,可以用于浏览器和Node.js。Axios具有拦截请求和响应的能力,使得我们可以在请求被发送之前或响应被处理之前对其进行修改或查看。下面是一个Axios拦截器的简单示例: 1.添加请求拦截器: axios.in…

LightGlue-OpenCV 实现实时相机图片特征点匹配

LightGlue-OpenCV 文章目录 LightGlue-OpenCVStep 1: 创建虚拟环境Step 2: 安装 LightGlue-OpenCV 并运行Step3: 运行 demo_camera.py效果 原理 LightGlue 是一种新的基于深度神经网络,用来匹配图像中的局部特征的深度匹配器。是 SuperGlue 的加强版本。相比于 Supe…

Qt/QML编程学习之心得:Linux下USB接口使用(25)

很多linux嵌入式系统都有USB接口,那么如何使用USB接口呢? 首先,linux的底层驱动要支持,在linux kernal目录下可以找到对应的dts文件,(device tree) usb0: usb@ee520000{compatible = "myusb,musb";status = "disabled";reg = <0xEE520000 0x100…

【C程序设计】C指针

学习 C 语言的指针既简单又有趣。通过指针&#xff0c;可以简化一些 C 编程任务的执行&#xff0c;还有一些任务&#xff0c;如动态内存分配&#xff0c;没有指针是无法执行的。所以&#xff0c;想要成为一名优秀的 C 程序员&#xff0c;学习指针是很有必要的。 正如您所知道的…

探索LinkedIn:使用TypeScript和jsdom库的高级内容下载器

概述 LinkedIn是一个专业的社交网络平台&#xff0c;拥有超过7亿的用户和数以亿计的职位、公司和教育机构的信息。对于数据分析师、市场营销人员、招聘人员和其他对LinkedIn数据感兴趣的人来说&#xff0c;能够从LinkedIn上获取和分析这些信息是非常有价值的。 因此&#xff0…

如何恢复Mac误删文件?

方法1. 使用撤消命令 当你在 Mac 上删除了错误的文件并立即注意到你的错误时&#xff0c;你可以使用撤消命令立即恢复它。顾名思义&#xff0c;此命令会反转上次完成的操作&#xff0c;并且有多种方法可以调用它。如果你已经采取了其他操作或退出了用于删除文件的应用程序&…

虾皮怎么选品:虾皮(Shopee)跨境电商业务成功的关键步骤

在虾皮&#xff08;Shopee&#xff09;平台上进行跨境电商业务&#xff0c;选品是至关重要的一环。有效的选品策略可以帮助卖家更好地了解市场需求&#xff0c;提高销售业绩和客户满意度。以下是一些成功的选品策略&#xff0c;可以帮助卖家在虾皮平台上取得更好的业务成绩。 先…

作为程序员,我建议你学会写作

原创/朱季谦 如果你留意观察&#xff0c;便会发现&#xff0c;随着互联网的发展&#xff0c;现在已经变成一个全民写作的时代。写作不再是文学爱好者的权利&#xff0c;也不再是知识分子的专属&#xff0c;你只需一台可以联网的手机或者电脑&#xff0c;再有一点文字组织能力&…

Django5+DRF入门教程

官方文档&#xff1a;https://www.django-rest-framework.org/ 创建项目 # 创建目录 mkdir drf_demo cd drf_demo# 创建虚拟环境 python -m venv evnv venv/Scripts/activate# 安装Django pip install django# 安装DRF pip install djangorestframework# 创建Django项目 djan…

http1.0、http1.1、http2.0

http1.0 1、每次请求都会和服务器建立一个tcp连接&#xff0c;完成请求后就立即断开tcp连接、请求回来的页面文件如果包含img、js、css&#xff0c;会在此后再次请求。 2、每次请求都返回全部资源。 3、对单个域名的server连接有限。 4、缓存通过expires、if-modifies-sinc…

为什么Java中“1000==1000”为false,而”100==100“为true?

大家好&#xff0c;我是可乐。 在日常编程中&#xff0c;我们经常遇到一些看似简单却隐藏着复杂逻辑的问题。 比如&#xff0c;你是否想过为什么在 Java 中表达式10001000会返回 false&#xff0c;而 100100 却返回 true 呢&#xff1f; Integer a 100; Integer b 100; Sy…

k8s 运行深度学习 k8s实现原理

在大型分布式系统中,定会存在大量并发写入的场景。在这种场景下如何进行更好的并发控制,即在多个任务同时存取数据时保证数据的一致性,成为分布式系统必须解决的问题。 悲观并发控制和乐观并发控制是并发控制中采用的主要技术手段,对于不同的业务场景,应该选择不同的控制方…

网安入门10-文件上传(中国蚁剑)

​ 什么是文件上传漏洞——来自GPT-4 文件上传漏洞是一种常见的安全漏洞&#xff0c;它出现在Web应用程序中&#xff0c;允许攻击者上传恶意文件到服务器。这种漏洞可能导致严重的安全问题&#xff0c;例如服务器被入侵、数据泄露和应用程序功能受损。 文件上传漏洞通常由以…

学习笔记——C++运算符之逻辑运算符

作用&#xff1a;用于根据表达式的真值返回真值或假值 逻辑运算符有以下符号&#xff1a; #include<bits/stdc.h> using namespace std; int main(){// 逻辑运算符 非 !int a10;//在c中&#xff0c;除了0均是真 cout<<!a<<endl;//0 cout<<!!a<<…

oninput和onchange事件的区别是什么

oninput 和 onchange 是两种不同的事件&#xff0c;它们在处理用户输入时具有一些区别。 1. oninput 事件&#xff1a; - 触发时机&#xff1a;当用户输入框的值发生改变时立即触发&#xff0c;即时反馈用户的输入。 - 适用元素&#xff1a;主要用于 <input>、<…

GNSS观测值线性组合

1 在几何距离线性化中&#xff0c;不论变量x的估计值是多少&#xff0c;估值改正数的系数是不变的。 2.宽、窄巷组合&#xff08;噪声放大倍数&#xff09; 由于几何距离与频率无关&#xff0c;在宽巷组合中&#xff0c;可直接依据几何距离&#xff0c;四舍五入确定宽巷模糊度 …

Android 车联网——CarService介绍(二)

上一篇文章我们介绍了 Android Automotive OS 车载操作系统,其实就是传统的手机系统加上相关的汽车服务,构成了现在的车载操作系统,而其中 CarService 就是提供汽车相关功能的最主要的模块。 本文重点来介绍一下 CarService,也就是 Android 汽车服务。 一、CarService组成…

机器学习周刊第二期:300个机器学习应用案例集

大家好 前文&#xff1a;机器学习项目精选 第一期 继续分享我最近看过并觉得非常硬核的资源&#xff0c;包括Python、机器学习、深度学习、大模型等等。 1、Python编程挑战 地址&#xff1a;https://github.com/Asabeneh/30-Days-Of-Python 30天Python编程挑战是一个逐步学…

解锁Python装饰器的魔力:提升代码魅力的秘密武器

解锁Python装饰器的魔力&#xff1a;提升代码魅力的秘密武器 Python的装饰器&#xff08;Decorators&#xff09;是一种特殊的语法构造&#xff0c;它允许我们在不修改被装饰函数源代码的情况下&#xff0c;通过在其周围添加额外功能或行为。 装饰器本质上是一个函数&#xf…

基于SSM的网上购物平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…