//浏览器关闭窗口不关闭浏览器,可以通过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以上
或许可以两种方法结合