postMessage解决跨域、消息传递(平台嵌入其他项目,需要相互发送接受消息)

使用背景:其他平台嵌入到自己项目平台上,使用iframe做嵌套,但是涉及到进来免登录以及跨域问题,使用postMessage发送信息。

想要使用 postMessage 实现跨域通信和页面间数据通信,只要记住 window 提供的 postMessage 方法和 message 事件。

1、发送消息:

otherWindow.postMessage(message, targetOrigin, [transfer]);

otherWindow
其他窗口的一个引用。比如 iframe 的 contentWindow 属性、执行 window.open 返回的窗口对象、或者是命名过或数值索引的 window.frames。

message
要发送的消息。它将会被结构化克隆算法序列化,所以无需自己序列化,html5规范中提到该参数可以是JavaScript的任意基本类型或可复制的对象,然而并不是所有浏览器都做到了这点儿,部分浏览器只能处理字符串参数,所以我们在传递参数的时候需要使用JSON.stringify()方法对对象参数序列化。

targetOrigin
“目标域“。URI(包括:协议、主机地址、端口号)。若指定为”*“,则表示可以传递给任意窗口,指定为”/“,则表示和当前窗口的同源窗口。当为URI时,如果目标窗口的协议、主机地址或端口号这三者的任意一项不匹配 targetOrigin 提供的值,那么消息就不会发送。

2、接收消息
如果指定的源匹配的话,那么当调用 postMessage() 方法的时候,在目标窗口的Window对象上就会触发一个 message 事件。
获取postMessage传来的消息:为页面添加onmessage事件。

window.addEventListener('message',function(e) {var origin = event.origin;// 通常,onmessage()事件处理程序应当首先检测其中的origin属性,忽略来自未知源的消息if (origin !== "http://example.org:8080") return;// ...
}, false)

event 的属性有:

data: 从其他 window 传递过来的数据副本。
origin: 调用 postMessage 时,消息发送窗口的 origin。例如:“http://example.com:8080”。
source: 对发送消息的窗口对象的引用。可以使用此来在具有不同 origin 的两个窗口之间建立双向数据通信。

小demo参考下:
http://www.domain1.com/a.html

<iframe id="iframe" src="http://www.domain2.com/b.html"></iframe><script>
var iframe = document.getElementById('iframe');iframe.onload = function() {// 向domain2发送跨域数据iframe.contentWindow.postMessage('来自domain1的消息', 'http://www.domain2.com');//或  window.frames[0].postMessage('来自domain1的消息', 'http://www.domain2.com');
};// 接受domain2返回数据
window.addEventListener('message',(e) => {console.log(e.data);
}, false);
</script>

http://www.domain2.com/b.html

<script>
// 接收domain1的数据
window.addEventListener('message',(e) => {console.log(e.data);if(e.origin !== 'http://www.domain1.com') return;// 发送消息给domain1window.parent.postMessage('来自domain2的消息', e.origin);// 或 window.top.postMessage('来自domain2的消息', e.origin);// 或 e.source.postMessage('来自domain2的消息', e.origin);
}, false);
</script>

项目真实使用:
index.vue

<template><div><iframeid="yhPage"src="http://192.168.5.58:8002/#/user/login"sandbox="allow-same-origin allow-top-navigation allow-forms allow-scripts"allow="payment"frameborder="0"orgin="*"style="width: 100vw; height: 100vh"></iframe></div>
</template><script>
export default {data() {return {isShow: false,};},created() {const YHData = JSON.parse(localStorage.getItem("YHData"));// send data to yhsetTimeout(() => {document.getElementById("yhPage").contentWindow.postMessage({data: YHData,},// 与iframe嵌套的地址一致"http://192.168.5.58:8002");}, 500);//setTimeout(() => {this.isShow = true;}, 600);},
};
</script>

嵌入项目组要接收数据:

login.vue页面

created(){window.addEventListener('meaasge', e=>{console.log('fff')if(e.origin.indexOf(9095) > -1){// 处理接收到的数据console.log(e.data)}})}

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

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

相关文章

开启创意之旅:免费、开源的噪波贴图(noise texture)生成网站——noisecreater.com详细介绍

在当今数字创意领域&#xff0c;噪波贴图&#xff08;Noise Texture&#xff09;是游戏渲染、游戏开发、美术设计以及影视制作等行业不可或缺的艺术素材之一。为了满足广大创作者的需求&#xff0c;noisecreater.com应运而生&#xff0c;成为一款免费、开源的噪波贴图生成工具。…

保护IP地址免受盗用的有效方法

IP地址是互联网通信的基础&#xff0c;然而&#xff0c;由于其重要性&#xff0c;IP地址的盗用成为一种潜在的网络威胁。本文将深入探讨防止IP地址被盗用的方法&#xff0c;以维护网络的安全性。 第一部分&#xff1a;IP地址盗用的威胁与风险 1.1 IP地址盗用的定义 IP地址盗…

数据可视化---离群值展示

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

操作系统系列:Unix进程系统调用fork,wait,exec

操作系统系列&#xff1a;Unix进程系统调用 fork系统调用fork()运用的小练习 wait系统调用Zombiesexec 系列系统调用 开发者可以查看创建新进程的系统调用&#xff0c;这个模块会讨论与进程相关的Unix系统调用&#xff0c;下一个模块会讨论Win32 APIs相关的进程。 fork系统调用…

java参数校验

引入依赖 <!--参数效验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!--Length参数效验--><dependency><groupId>org.hib…

量子计算:开启IT领域的新时代

量子计算&#xff1a;开启IT领域的新时代 一、量子计算的基本原理与背景 量子计算作为一项前沿高级技术&#xff0c;正逐渐引起IT领域的广泛关注。传统计算机是通过二进制位&#xff08;0和1&#xff09;来储存和处理信息&#xff0c;而量子计算机则利用量子位或称为“量子比特…

python requests 设置全局代理,之后调用就不用设置

import requestsproxies {http: http://your_proxy_server:port,https: https://your_proxy_server:port }# 设置全局代理 session requests.Session() session.proxies.update(proxies)# 发起请求 response_with_proxy session.get(https://example.com)# 取消代理请求 res…

【python基础】-- yarn add 添加依赖的各种类型

目录 1、安装 yarn 1.1 使用npm安装 1.2 查看版本 1.3 yarn 淘宝源配置 2、安装命令说明 2.1 yarn add&#xff08;会更新package.json和yarn.lock&#xff09; 2.2 yarn install 2.3 一些操作 2.3.1 发布包 2.3.2 移除一个包 2.3.3 更新一个依赖 2.3.4 运行脚本 …

华为OD机试真题-螺旋数字矩阵-2023年OD统一考试(C卷)

题目描述:疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m(0 < n ≤ 999,0 < m ≤ 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成一个m行矩阵。 小明对这个矩阵有些要求: 1.每行数字的…

【设计模式--行为型--备忘录模式】

设计模式--行为型--备忘录模式 备忘录模式定义结构案例实现白箱备忘录模式黑箱备忘录模式 优缺点使用场景 备忘录模式 定义 又叫快照模式&#xff0c;在不破坏封装性的前提下&#xff0c;捕获一个对象的对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便…

Python控制Excel自动刷新页面

比如我们有一个待刷新的Excel叫测试.xlsx 这里我们使用python控制Excel的应用来直接刷新相关页面&#xff1a; 传入的Excel路径需要是完整的路径&#xff0c;否则会提示找不到&#xff1a;pywintypes.com_error: (-2147352567, 发生意外。, (0, Microsoft Excel, 抱歉&#x…

常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)

目录 ORACLE MySQL PostgreSQL SQL Server ORACLE SELECT * FROM (SELECT t.*, ROWNUM AS rnFROM (SELECT * FROM 表名 ORDER BY 排序字段) tWHERE ROWNUM < 结束行数 ) WHERE rn > 开始行数; 其中&#xff0c;表名是你要查询的表名&#xff0c;排序字段是你希望按…

Java 自定义注解

Java 自定义注解&#xff0c; 以及interface Target Retention Around Before After ProceedingJoinPoint JoinPoint 等用法 注解应用非常广泛&#xff0c;我们自定义注解能简化开发各种各种业务 一、关键字解释 (1) 定义注解时&#xff0c;关键字 interface 来表示注解类的类…

Spring Boot学习随笔- 实现AOP(JoinPoint、ProceedingJoinPoint、自定义注解类实现切面)

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十一章、AOP 11.1 为什么要使用AOP 问题 现有业务层开发存在问题 额外功能代码存在大量冗余每个方法都需要书写一遍额外功能代码不利于项目维护 Spring中的AOP AOP&#xff1a;Aspect 切面 Oriented 面向…

前端面试题(计算机网络):常见的HTTP请求头和响应头

前端面试题&#xff08;计算机网络&#xff09;&#xff1a;常见的HTTP请求头和响应头 HTTP Request Header 常见的请求头&#xff1a;HTTP Responses Header 常见的响应头&#xff1a;常见的 Content-Type 属性值有以下四种&#xff1a; HTTP Request Header 常见的请求头&…

竞赛保研 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于python 机器视觉 的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 &#x1f9ff; 更多资…

【Python 基础】-- 在 mac OS 中安装 多个 python 版本

目录 1、需求 2、实现 2.1 安装 pyenv 2.2 安装 pyenv-virtualenv 2.3 配置环境变量 2.4 创建 python 3.9.9 的环境 2.5 激活环境&#xff0c;在当前项目目录中使用&#xff0c;即执行 python 1、需求 由于项目所依赖的 python 版本有多个&#xff0c;需要在不同的 pyth…

主从reactor多线程实现

现场模型图片&#xff0c;从网上找的 出于学习的目的实现的&#xff0c;如有不对的地方欢迎留言知道&#xff0c;简单实现了http的请求&#xff0c;可通过postman进行访问 启动项目&#xff1a; 返回数据示例 postman请求 附上源码&#xff0c;有问题直接看源码吧

智能优化算法应用:基于闪电连接过程算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于闪电连接过程算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于闪电连接过程算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.闪电连接过程算法4.实验参数设定…

Flink实时电商数仓(二)

GitLab的用户创建和推送 在root用户-密码界面重新设置密码添加Leader用户和自己使用的用户使用root用户创建相应的群组使用Leader用户创建对应的项目设置分支配置为“初始推送后完全保护”设置.gitignore文件&#xff0c;项目配置文件等其他非通用代码无需提交安装gitlab proj…