From 0cfb368ff4c93c13355f995796b2fc7434bbe6a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Wed, 4 Mar 2026 17:18:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(App):=20=E4=BF=AE=E5=A4=8D=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E5=85=B3=E9=97=AD=E6=97=B6=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=80=80=E5=87=BA=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 页面加载时标记为"活动状态" - 监听页面显示事件处理从缓存恢复的情况 - 添加handlePageShow方法在页面显示时恢复活动状态 - 修改handleBeforeUnload逻辑使用延迟检查区分关闭和刷新 - 添加sessionStorage状态标记判断是否真正关闭浏览器 - 优化退出登录触发机制避免误触发 --- src/App.vue | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/App.vue b/src/App.vue index 5d191f7..6477526 100644 --- a/src/App.vue +++ b/src/App.vue @@ -18,12 +18,19 @@ this.versionReload() }, mounted() { + // 页面加载时标记为"活动状态" - rqrq + sessionStorage.setItem('page_active', 'true') + // 监听浏览器关闭事件,自动退出登录 - rqrq window.addEventListener('beforeunload', this.handleBeforeUnload) + + // 监听页面显示事件(从缓存恢复或刷新后) - rqrq + window.addEventListener('pageshow', this.handlePageShow) }, beforeDestroy() { // 移除事件监听 - rqrq window.removeEventListener('beforeunload', this.handleBeforeUnload) + window.removeEventListener('pageshow', this.handlePageShow) }, methods: { versionReload(){ @@ -37,14 +44,29 @@ location.reload(); } }, + // 页面显示时(刷新后)恢复活动状态 - rqrq + handlePageShow() { + sessionStorage.setItem('page_active', 'true') + }, // 浏览器关闭时自动退出登录 - rqrq - handleBeforeUnload() { - const token = this.$cookie.get('token') - if (token && token.trim()) { - // 使用 sendBeacon 发送退出请求,可靠性高 - rqrq - const url = this.$http.adornUrl('/sys/logout') - navigator.sendBeacon(url, new Blob([JSON.stringify({ token })], { type: 'application/json' })) - } + handleBeforeUnload(e) { + // 标记为"即将卸载"状态 - rqrq + sessionStorage.setItem('page_active', 'false') + + // 延迟50ms检查是否是真正关闭(而不是刷新)- rqrq + setTimeout(() => { + const pageActive = sessionStorage.getItem('page_active') + // 如果50ms后仍然是false,说明是真正关闭,执行退出登录 - rqrq + if (pageActive === 'false') { + const token = this.$cookie.get('token') + if (token && token.trim()) { + // 使用 sendBeacon 发送退出请求,可靠性高 - rqrq + const url = this.$http.adornUrl('/sys/logout') + navigator.sendBeacon(url, new Blob([JSON.stringify({ token })], { type: 'application/json' })) + console.log('检测到浏览器/标签页关闭,已自动退出登录 - rqrq') + } + } + }, 50) } } }