记录Vue区分浏览器关闭和刷新操作

//浏览器关闭窗口不关闭浏览器,可以通过ctrl+shift+t,重新打开关闭的窗口,安全考虑需要删除sessionStorage
//需要区分浏览器窗口刷新和关闭
//刷新时执行顺序 beforeunload->onunload>onload(包含beforecreate,cteated,mounted)
//关闭窗口执行顺序 beforeunload->onunload
//1.在beforecreate进行判断,同时监听onunload,在onunload中更新刷新或退出窗口的时间(标识为no更新时间,标识为go清空sessionStorage跳登录)
//2.每次beforeCreate判断sessionStorage是否有unloadTime时间-没有是登录后第一次进入页面->添加标识表示不是退出窗口
//3.sessionStorage中已有时间,窗口已有过刷新或关闭
//4.根据当前时间和sessionStorage中的时间比较,差值大于5S(可调整,刷新一般为1S,这1S是执行beforeunload,和进入onload的时间)
//5.大于5S(5S现实情况不可能-关闭窗口5s,电脑就被抢了,还用快捷键打开原窗口)为关闭窗口后通过其他手段打开原窗口,需要删除原来的sessionStorage
//6.大于5s,清楚store和sessionStorage,同时标识为go,跳转登录页面

缺点:不通过快捷键打开相当于还是没有退出

 不做兼容处理,chrome

	beforeCreate(){
		let loadTime = new Date().getTime();
		let unloadTime = sessionStorage.getItem('unloadTime')??0
		if (unloadTime === 0){
			sessionStorage.setItem('toClear','no')
			//sessionStorage.setItem('unloadTime', loadTime);
		}else{
			let diffTime = loadTime-unloadTime
			if( diffTime > 5000 ){
                //登出请求
				this.$store.dispatch('Logout', {}).then(() => {
					this.$store.commit("clearTags");
					sessionStorage.setItem('toClear','go')
					window.location.href = import.meta.env.VITE_APP_LOGIN;
				}).catch(() => {
					this.$store.commit("clearTags");
					sessionStorage.setItem('toClear','go')
					window.location.href = import.meta.env.VITE_APP_LOGIN;
				});
			}
		}
	},
	mounted() {
		window.addEventListener('unload', () => this.unloadHandler())
	},
	destroyed() {
		window.removeEventListener('unload',()  => this.removeUnload())
	},
	methods:{
		removeUnload(){
		},
		unloadHandler() {
			let toClear = sessionStorage.getItem('toClear');
			if (toClear === 'go'){
				sessionStorage.clear()
				this.$router.push("/login")
			}else{
         if (toClear === 'no'){
					 sessionStorage.setItem('unloadTime', new Date().getTime());
				 }
			}
		}
	}
第二种方法:通过onbeforeunload与onunload的时间差,但这种方法有误差,机器和网络的不同,可能造成的时间差不确定,调试时关闭窗口在1ms-40ms不等,刷新在20ms以上

  或许可以两种方法结合

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值