iframe token 通信。iframe 子应用无法收到 message

devtools/2024/10/23 1:00:26/

问题描述

父应用内嵌 iframe 子应用,需要在一开始传递 token。这种情况下监听 message 的时机(代码放置的位置很重要),否则可能出现获取不到 message 的问题。

如果采用等子应用加载完,再 postMessage 给父应用,父应用再传递 token。这可能导致过多的双向 postMessage ,使得子应用服务器繁忙,接口无法发送消息。

解决思路

方案一

url + token,没用这种,觉得不安全。就算要用也要将 token 二次加密传送,才更安全些。

方案二

由于我的是不同域名的通信,因此直接采用 postMessage 通信方式。

父应用在内嵌 iframe 的页面,监听 iframe 初始化加载

onBeforeMount(async () => {iframeRef.value &&(iframeRef.value.onload = () => {iframeRef.value?.contentWindow?.postMessage({ type: 'token', data: 'token-xxxx' },'*')})
})// iframeSrc
const iframeSrc = computed(() => {return `${import.meta.env.VITE_PUBLIC_CHAT}?useCustomApi=true`
})// template
<iframeref="iframeRef":src="iframeSrc"frameborder="0"class="h-[calc(100%-42px)] w-full"
></iframe>

子应用最早监听的位置——入口: main.ts
得到 token 后,再 reload()。其他情况下不需要 reload()
这里的 token 可以存储在 localStorage 或者 sessionStorage。监听页面卸载时,删除 token。

window.addEventListener('message', messageEventHandler)
window.onbeforeunload = () => {window.removeEventListener('message', messageEventHandler)
}export const messageEventHandler = (e: MessageEvent) => {const { type, data } = e.dataconst authStore = useAuthStore()const parentStore = useParentStore()switch (type) {case 'token':if (!authStore.token) {authStore.setToken(data)window.location.reload()}break}
}

结论

方案二,可以解决获取不到 message 的问题。或者过多的双向 postMessage 导致子应用服务器繁忙,接口无法发送消息。如果有更好的方案,欢迎评论区提出。


http://www.ppmy.cn/devtools/128003.html

相关文章

【Flutter】配置:远程开发

在Linux云服务器上配置Flutter的Web开发环境主要包括安装Flutter SDK、配置环境变量、安装所需的依赖项&#xff0c;以及确保你的服务器可以访问Flutter开发所需的工具。以下是详细步骤&#xff1a; 安装依赖项 首先&#xff0c;更新包管理器并安装必要的依赖项。打开终端并运…

SpringBoot框架下的桂林旅游资源整合

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

关于k8s集群高可用性的探究

1. k8s的高可用的核心是什么&#xff1f; 说到核心、本质 意味着要从物理层来考虑技术 k8s是一个容器编排管理工具&#xff0c;k8s受欢迎的时机 是docker容器受欢迎时&#xff0c;因为太多的docker容器&#xff0c;管理起来是一个大工程 那么刚好k8s是google自己用了十来年…

web网页QQ登录

代码&#xff1a; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>QQ登录ent</title> </head> <style>ul > li{list-style: none; } a …

2024软件测试面试大全(答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到…

百度地图如何添加店铺位置?

在这个信息化时代&#xff0c;任何店铺若要实现更好的发展&#xff0c;都无法脱离信息的传播。简而言之&#xff0c;店铺需要对自身进行宣传&#xff0c;提升知名度。只有让更多的人知晓店铺的存在&#xff0c;才能够获取更多的客流量。而想要提升店铺的曝光度和知名度&#xf…

SpringBoot驱动的智能物流管理解决方案

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理智能物流管理系统的相关信息成为必然。开发…

Flume面试整理-如何处理Flume中的数据丢失

在Apache Flume中,数据丢失是一个可能出现的严重问题,特别是在处理大规模数据时。数据丢失通常会发生在数据从Source(源)到Channel(通道),或从Channel到Sink(汇)传输的过程中。如果不处理得当,Flume的崩溃或网络故障可能会导致丢失的数据无法恢复。以下是几种常见的F…