From 6035372b02b9007cc433ff24ef2991a0184684cf Mon Sep 17 00:00:00 2001 From: syruan <15555146157@163.com> Date: Wed, 17 Dec 2025 09:10:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=91=E5=90=AC=E4=BC=A0=E8=BE=93=E8=BF=87?= =?UTF-8?q?=E6=9D=A5=E7=9A=84=20postMessage=E4=BC=A0=E8=BE=93token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 59 +++++++++++++++++++++++++++++++++++++++++++++++ src/http/index.ts | 30 ++++++++++++++++++++---- 2 files changed, 84 insertions(+), 5 deletions(-) diff --git a/src/App.vue b/src/App.vue index d5611d0..43ec926 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,9 +4,68 @@ import { getUserInfoAPI } from 'http/api/login/index' import { mainStore } from 'store/main' import { useStore } from 'store/user' import { useRoute, useRouter } from 'vue-router' +import { onMounted, onUnmounted } from 'vue' + const userStore = mainStore() const store = useStore() const router = useRouter() + +// 监听来自A项目的 postMessage +const handleMessage = (event: MessageEvent) => { + // 安全检查:验证消息来源 + // 在生产环境中,建议验证 event.origin 是否为可信来源 + // 例如: if (event.origin !== 'https://your-a-project-domain.com') return + + try { + if (event.data && event.data.type === 'SET_TOKEN') { + const token = event.data.token + console.log('B项目收到来自A项目的token') + + if (token && typeof token === 'string') { + // 将token存储到localStorage,供axios拦截器使用 + localStorage.setItem('tokenNew', token) + console.log('Token已成功保存到localStorage,后续请求将自动携带Authorization头') + + // 可选:向A项目发送确认消息 + if (event.source && typeof event.source.postMessage === 'function') { + (event.source as Window).postMessage( + { type: 'TOKEN_RECEIVED', success: true }, + event.origin + ) + } + } else { + console.warn('收到的token格式不正确') + } + } + } catch (error) { + console.error('处理postMessage时发生错误:', error) + } +} + +onMounted(() => { + // 添加消息监听器 + window.addEventListener('message', handleMessage) + console.log('B项目已开始监听来自A项目的消息') + + // 检查localStorage中是否已有token + const existingToken = localStorage.getItem('tokenNew') + if (existingToken) { + console.log('✅ localStorage中已存在token:', existingToken.substring(0, 50) + '...') + } else { + console.log('⚠️ localStorage中暂无token,等待A项目发送...') + } + + // 向父窗口发送准备就绪的消息 + if (window.parent !== window) { + window.parent.postMessage({ type: 'B_PROJECT_READY' }, '*') + console.log('已向A项目发送准备就绪消息') + } +}) + +onUnmounted(() => { + // 清理监听器 + window.removeEventListener('message', handleMessage) +})