postmessage通信

在业务中,有一种开发形式为:多个子系统集成为一个父系统。每个系统之间都管理着不同的业务与逻辑,他们是互不干涉的。

那么,我们如何在父系统页面中操作子系统中的内容呢?

首先通过vite初始化两个项目。

父系统端口号为3001,子系统端口号为3000。

在这里插入图片描述

然后在父系统页面中通过一个iframe标签,打开子系统页面:

<div class="iframe" v-if="show"><iframe :src="`http://localhost:3001/#/?picUrl=${picUrl}`" frameborder="0"style="width:100%;height:100%"></iframe>
</div>

可以看到在父系统页面,成功打开了子系统页面内容。

在这里插入图片描述

postmessage通信

在web项目中通过iframe嵌入另一个第三方web项目,第三方web项目里点击某个按钮要实时调用web项目的全局函数打开某个全局弹窗或者进行路由跳转,这时候两个项目存在了数据交互,显然违反了同源策略,在HTML5标准引入的window对象下的postMessage方法,可以允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为 https),端口号(443 为 https 的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制。

从广义上讲,一个窗口可以获得对另一个窗口的引用(比如 targetWindow = window.opener),然后在窗口上调用 targetWindow.postMessage() 方法分发一个 MessageEvent 消息。接收消息的窗口可以根据需要自由处理此事件 (en-US)。传递给 window.postMessage() 的参数(比如 message )将通过消息事件对象暴露给接收消息的窗口。

语法

otherWindow.postMessage(message, targetOrigin, [transfer]);
  • 参数
    • otherWindow:其他窗口的一个引用,比如 iframe 的 contentWindow 属性、执行window.open返回的窗口对象。
    • message:将要发送到其他 window 的数据。它将会被结构化克隆算法序列化。这意味着你可以不受什么限制的将数据对象安全的传送给目标窗口而无需自己序列化。
    • targetOrigin:通过窗口的 origin 属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示无限制)或者一个 URI。在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配 targetOrigin 提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。这个机制用来控制消息可以发送到哪些窗口。
    • transfer(可选):是一串和 message 同时传递的 Transferable 对象。这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。

简单用法

首先看看3001端口的页面,看看他是如何向调用者3000端口页面发送信息的。

localhost:3001

<template>
<div>子系统的某个页面<div @click="toFather" class="btn">操作父系统中的数据</div>
</div>
</template><script setup>
import {ref, onMounted} from 'vue'const toFather = () => {// 调用postMessage方法,第一个参数是待传递的数据,第二个参数是 origin 源数据parent.postMessage({msg: "黑猫几绛"}, "*")}
</script>

这里的parent看起来有些突兀,进入lib.dom.d.ts文件下看看他的定义:

/** Refers to either the parent WindowProxy, or itself. It can rarely be null e.g. for contentWindow of an iframe that is already removed from the parent. */
declare var parent: WindowProxy;
/**

可以看到parent在这里表示的就是一个Window的代理对象,这一句话也可以写为:

window.parent.postMessage({msg: "黑猫几绛"}, "*")

localhost:3000

再来看看调用者页面是如何接收消息的:

<script setup>import {ref, onMounted} from 'vue'const receiveMessage = (event) => {console.log(event.data.msg); // 黑猫几绛}onMounted(()=>{window.addEventListener('message',receiveMessage, false)})
</script>
  • 在页面挂载的时候,通过addEventListener监听message事件
  • 具体的监听方法会收到一个event对象参数,可以接收被调用者页面传来的数据

基本思路就是这样,现在在页面中来看看最终效果:

在这里插入图片描述

扩展

origin判断

如果不希望从其他网站接收 message,不要为 message 事件添加任何事件侦听器。 这是一个完全万无一失的方式来避免安全问题。

在上面的图中可以看到,消息对象里面存在origin数据来存放消息来源信息,因此我们可以根据它来进行来源的判断,毕竟不能监听那些恶意网站传递过来的信息。

window.addEventListener("message", receiveMessage, false);function receiveMessage(event) {let origin = event.origin || event.originalEvent.origin;// 如果不是3001端口页面传递过来的消息,调用者就不处理这些消息if (origin !== "http://localhost:3001")return;// ...
}

注意:这个 origin 不能保证是该窗口的当前或未来 origin,因为 postMessage 被调用后可能被导航到不同的位置。

如果确实希望从其他网站接收 message,请始终使用 origin 和 source 属性验证发件人的身份。 任何窗口都可以向任何其他窗口发送消息,并且页面不能保证未知发件人不会发送恶意消息。

即使是验证身份后,也仍然应该始终验证接收到的消息的语法。 否则,信任只发送受信任邮件的网站中的安全漏洞可能会在网站中打开跨网站脚本漏洞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34252.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软历史上的12个Windows操作系统版本排名

作为全球最流行的操作系统之一&#xff0c;Windows 操作系统的发布对世界产生了深远的影响。Windows 操作系统的发布历程可以追溯到 1985 年&#xff0c;当时微软推出了第一个版本的 Windows。随着时间的推移&#xff0c;Windows 不断升级和改进&#xff0c;推出了多个版本&…

独立开发变现周刊(第86期):月收入4000美元的日程规划器

分享独立开发、产品变现相关内容&#xff0c;每周五发布。 目录 1、NotionReads: 在Notion中管理你的阅读书籍2、Zaap.ai: 面向创作者的一站式工具3、microfeed: 开源的可自我托管的轻量级内容管理系统(CMS)4、Reactive Resume&#xff1a;一个免费的开源简历生成器5、一个月收…

苹果的 Vision Pro 会重蹈谷歌眼镜的覆辙吗?

本文作者认为&#xff0c;一款成功的AR头戴式设备需要考虑以下几方面&#xff1a;成本高&#xff0c;回报低&#xff1b;安全与隐私问题&#xff1b;时机与市场&#xff1b;4、设计与社会接受度。 原文链接&#xff1a;https://uxdesign.cc/can-apples-vision-pro-succeed-wher…

chatgpt赋能python:Python描述性统计分析:基础概念、应用和实例分析

Python描述性统计分析&#xff1a;基础概念、应用和实例分析 作为一种高效、可扩展和易于学习的编程语言&#xff0c;Python在文本处理、数据挖掘、机器学习、数据可视化等方面已经得到了广泛应用。在数据分析领域&#xff0c;Python拥有强大的描述性统计分析库&#xff0c;可…

AIGC:Google Bard VS ChatGPT 简介及对比分析

文章目录 [toc]前言一、Bard和ChatGPT二、应用场景三、时效性小结其他 前言 自从 OpenAI 向公众发布ChatGPT以来的过去几个月里&#xff0c;我们都见证了围绕 ChatGPT 的各种测评&#xff0c;并为它带来的效果感到惊艳。昨晚Google开放了自家研发的AI聊天机器人Bard的测评入口…

R语言利用wordcloud2绘制词云

本次的重点绘制词云&#xff0c;所以并不太重视其他分析方面的论述。 本机环境&#xff1a; window 10 R x64 3.3.0 R包&#xff1a; tmcn&#xff1a;词频统计 wordcloud2&#xff1a;绘制词云 Rwordseg&#xff1a;分词 由于tmcn和Rwordseg包在R3.3.0的版本中没有可以…

同一界面画出多个QQ图(R语言)

题目&#xff1a;一名研究者用光子吸收法测量了妇女骨骼中无机物含量&#xff0c;对三根骨头主侧和非主侧记录了测量值&#xff0c;数据框“T1bones.txt”中的第2至第7列记录了相应数据。对各个变量做qq图&#xff0c;在同一个界面画出所有的qq图&#xff0c;不同的qq图用不同颜…

R语言各个包里面的数据集

关注微信公共号&#xff1a;小程在线 关注CSDN博客&#xff1a;程志伟的博客 Package Item Title csv docdatasetsAirPassengersMonthly Airline Passenger Numbers 1949-1960CSVDOCdatasetsBJsalesSales Data with Leading IndicatorCSVDOCdatasetsBODBiochemical Oxygen Dema…

R语言 聊天词云图

准备聊天记录 建议使用QQ聊天记录&#xff0c;导出txt格式 进行文本分词并可视化 install.packages("wordcloud2") install.packages("jiebaR") install.packages("jiebaRD") library(wordcloud2) library(jiebaRD) library(jiebaR) enginew…

巧用R语言实现各种常用的数据输入与输出

将数据输入或加载到R工作空间中&#xff0c;是使用R进行数据分析的第一步。R语言支持读取众多格式的数据文件&#xff0c;excel文件&#xff0c;csv文件&#xff0c;txt文件和数据库&#xff08;MYSQL数据库&#xff09;等&#xff1b;其中&#xff0c;excel和csv是我们最常遇到…

R语言安装 + 读入csv数据画图的过程中学习到的东西~~(ง •_•)ง

总体来说&#xff0c;我觉得R语言和python在画图上是有些相似的~ 目录 一、安装二、读入CSV数据三、保存代码代码 一、安装 B站上搜一个UP主&#xff1a;基因学苑。看他的安装教程及设置&#xff0c;很详细。 总体来说就是先下 R&#xff0c;再下 RStudio&#xff0c;然后使用…

超级干货 :手把手教你学习R语言(附资源链接)

作者&#xff1a;NSS&#xff1b;翻译&#xff1a;杨金鸿&#xff1b;校对&#xff1a;韩海畴&#xff0c;林亦霖&#xff1b; 本文约3000字&#xff0c;建议阅读7分钟。本文为带大家了解R语言以及分段式的步骤教程&#xff01; 人们学习R语言时普遍存在缺乏系统学习方法的问题…

R语言---使用cgdsr包下载TCGA数据---笔记整理

原文链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzAxMDkxODM1Ng&mid2247486492&idx1&sn3a7251244377fdd4b2a3aa5c8cd1131a&chksm9b484ca7ac3fc5b1a21202cf25ff15a8eec434424aa3e48787129fa6f5e66ebe57ffcb631772&scene21#wechat_redirect 一&…

R语言画词云图

词云图大家都很常见,主要是用来展示词语的频次,用来发现突出贡献的词语! 用于词云图的工具很多,但制作过程有些麻烦!今天我们来使用R语言做一下词云图,看看会有什么结果! 软件介绍 R RStudio 词云图教程 1.首先我们准备一个Excel文件,将单词或者词语,以及对应的频…

【教程】使用R语言绘制词云图

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 最近木易巷在了解R语言&#xff0c;今天给大家分享一下使用R语言绘制出词云图的教程。 什么是R语言 R语言是一个开源的数据分析环境&#xff0c;起初是由数位统计学家建立起来&#xff0c;以更好的进行统计计算和绘图。由于R可…

R语言入门——笔记(二)--包(package)的使用及RStudio的使用,加载包和数据集

一&#xff1a; 1.包&#xff08;package&#xff09;的使用 包是扩展R基本功能的机制&#xff0c;集成了众多函数。如果想使用某些函数而当前R中不存在&#xff0c;就可以找对应函数的包直接使用。 去哪里找包&#xff1f;如何使用包&#xff1f; CRAN: -install.packages…

1. R语言介绍、Rstudio的基本使用、帮助命令、内置数据集

b站课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99元买了&#xff0c;感觉不错&#xff09;&#xff1a;https://ke.qq.com/course/3707827#term_id103855009 本笔记前面的笔记参照b站视频…

【R语言】如何直接调取Wind、iFinD数据接口教程

对于从事经济、金融研究类工作的新人们其实最先遇到的是主流金融终端使用问题。国内的氛围很奇怪&#xff0c;一碰上正儿八经能派上用场的东西业内人士总是讳莫如深&#xff0c;好像别人学去了他就马上失业&#xff0c;听说现在学个最基础的数据接口都动不动要付钱&#xff0c;…

R语言高级数据管理

文章目录 高级数据管理标准差绝对中位差分位数quantile()函数百分位数 数据预处理中心化标准化 &#xff08;Standardization&#xff09;数据中心化和标准化的区别归一化&#xff08;Normalization&#xff09;标准化和归一化 概率函数协方差控制流分支结构重复和循环 自定义函…

用R语言,生成微信聊天记录词云。

首先获取微信聊天记录&#xff1a;并导出为txt文件 基于R语言&#xff1a; #install.packages("jiebaRD") #install.packages("jiebaR") #install.packages("data.table") #install.packages("stringr") #install.packages("rJa…