window.parent.postMessage-不用考虑跨域的父子页面通讯

2023-09-22 11:34:11

本人使用情景

  • A项目使用iframe内嵌了一个B项目的几个页面,A和B 都是vue2项目,A和B是父子内嵌关系,A和B 会有端口不同的情况,所有沟通起来会有跨域问题(前-后端,A前端页面-B前端页面),采用window.parent.postMessage方法主要解决的是A前端-B前端页面的问题,B页面token丢失时,要求页面跳转到A页面的登录页面,(如果在B页面直接使用window.location(‘A页面的登录页’)方法会不断内嵌很多个·‘A页面的登录页’,所以只能跳出这个内嵌页面,直接调取A页面的跳转方法才行,这就涉及到了,跨域时子页面调取父页面方法的问题

  • 如何定义父子页面?
    刚开始想的是不是只有是,A项目里使用了iframe的这个组件才是父页面,最后一想,vue就是个单页面组件,App.vue就是B最大的父亲!所以直接在App.vue里写方法了;现在的文件关系是

    • 父:A组件的App.vue
    • 子:B组件的axios封装的js文件(request.js),选择这个文件是因为,A引用了多个B页面,所以多个B页面都会报token请求错误,直接在源头上判断,就只需要写一遍这个代码
  • 介绍上面文件关系的目的是
    想说的是该方法不要拘泥于xx.vue文件只能和xxx.vue文件通信;.vue文件和和.js文件通信,因为方法最终都是转化成js文件

window.parent.postMessage方法

  • 简介

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

    /**
     * otherWindow:其他窗口的一个引用,比如 iframe 的 contentWindow 属性、执行 window.open 返回的窗口对象、或者是命名过或数值索引的 window.frames、或者父级window.parent
     * message:将要发送到其他 window的数据
     * targetOrigin:指定哪些窗口能接收到消息事件,其值可以是 *(表示无限制)或者一个 URI。
     * transfer:可选,是一串和 message 同时传递的 Transferable 对象。这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。
     */
     
    otherWindow.postMessage(message, targetOrigin, [transfer]);
    
    
    
  • 代码(vue2)

// 父页面:  A项目的App.js


<script>
export default {
  mounted(){
  // 在挂载函数里写监听函数
    window.addEventListener('message', this.receiveMessage, false)
  },
  methods:{
    // 监听时调用的函数,也可以直接写在 window.addEventListener里
    receiveMessage(event){
      if (event.data == 'CallParentMethod') {
         // 执行父页面的方法
         this.$router.replace('/')
      }
    }

  }
}
</script>

// 子页面: B组件的axios封装的js文件(request.js)
 
 // 响应拦截里报错后的某一个判断里
 		/**
         * 缺失token直接登出,
         */
        if(res.result=="缺少Token" ||res.result =='无效Token'){
          // let targetOrigin = 'http://xxxx'; // 父页面的域名、url
          // 我这里使用的*
          window.parent.postMessage('CallParentMethod', '*');

        }

window.addEventListener方法记录

之前写js时一直用,现在好久没用了忘记了

/**
 * event:必须。字符串,指定事件名。注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。提示: 所有 HTML DOM 事件,可以查看我们完整的 HTML DOM Event 对象参考手册。
 * function:必须。指定要事件触发时执行的函数。当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。
 * useCapture:可选。布尔值,指定事件是否在捕获或冒泡阶段执行。true - 事件句柄在捕获阶段执行,false- false- 默认。事件句柄在冒泡阶段执行
 */
 
element.addEventListener(event, function, useCapture)

//message:该事件通过或者从对象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息时触发

更多推荐

git及dbc的学习

1)git的使用方法CommandlineinstructionsYoucanalsouploadexistingfilesfromyourcomputerusingtheinstructionsbelow.Gitglobalsetupgitconfig--globaluser.name"username"gitcon

redis分布式锁

用于用户重复注册,点击过快,有可能会注册相同的手机号问题。给用户手机号枷锁一分钟时间,判断相同的手机号。判断下面这块代码执行时间是否超过一分钟时间,不论超没超过都会释放锁,下个同样的手机号再次注册,都得等到代码执行完毕后(或者是一分钟后)才能进行注册,防止有两个相同的手机号,两个线程,查询数据库都没存在,而注册了两次,

竞赛选题 基于机器视觉的银行卡识别系统 - opencv python

1前言🔥优质竞赛项目系列,今天要分享的是基于深度学习的银行卡识别算法设计该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🧿更多资料,项目分享:https://gitee.com/dancheng-senior/postgraduate2算法设计流程银行卡卡号识别技术原理是先对银行卡图像定位,保障获取图像绝对位置

SpringSecurity---内存认证和数据库认证

目录一、内存认证二、认证逻辑三、数据库认证(也就是用户名和密码在数据库中寻找)(1)mapper层(2)启动类添加扫描注解(3)编写UserDetailsService实现类一、内存认证@ConfigurationpublicclassSecurityConfig{//定义认证逻辑@BeanpublicUserDeta

springboot整合mybatis

整合SpringBoot与MyBatis框架的步骤如下:步骤1:创建SpringBoot项目-在IDE中创建一个新的SpringBoot项目。步骤2:添加相关依赖-在项目的pom.xml文件中添加以下依赖:<dependencies><dependency><groupId>org.springframework.bo

基于PHP的短视频SEO矩阵系统源码开发

随着短视频市场的爆发式增长,越来越多的企业开始寻求在短视频领域建立自己的品牌形象,增加用户粘性和获取更多流量。为此,一套高效的短视频SEO矩阵系统源码显得尤为重要。本文将介绍基于PHP语言的短视频SEO矩阵系统源码开发,帮助读者更好地了解该系统的实现原理和开发过程。一、系统概述短视频SEO矩阵系统是一套基于PHP语言开

千万级用户的大型网站,如何进行服务器压力预估?

前言:一般情况下,单台Tomcat服务器每秒支撑500请求,单台MySQL数据库每秒支撑5000左右的请求,单台Redis缓存支撑每秒几万请求。1、千万级用户量的压力预估假设大型网站预估用户数是1000万,那么根据28法则,每天会来访问这个网站的用户占到20%,也就是200万用户每天会过来访问。通常假设平均每个用户每次

Linux 文件权限基础:文件和目录权限管理指南

文章目录Linux文件权限基础1.引言1.1什么是文件权限1.2文件权限的重要性2.Linux文件权限基础2.1Linux文件系统简介2.2文件和目录的属性2.3权限类型:读、写和执行2.4所有者、组和其他用户2.5权限符号表示法:r、w、x和-2.6使用ls-l命令查看文件权限3.修改文件权限3.1使用chmod命令

【JVM】Java的内存模型(JMM)!

一、运行时数据区域划分JVM虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8之前分为:线程共享(Heap堆区、MethodArea方法区)、线程私有(虚拟机栈、本地方法栈、程序计数器)JDK1.8以后分为:线程共享(Heap堆区、MetaSpace元空间)、线程私有(虚拟机栈、本

只需100GB内存,让Falcon 180B在你的电脑上起飞

一、前言自2023年5月,阿布扎比技术创新研究所(TII)发布了两个预训练的LLM:Falcon7B和Falcon-40B,这两个模型的表现十分优异,在OpenLLM排行榜上高居榜首。然而,在短短不到几个月的时间,研究所又推出了第三个重量级的大语言模型——Falcon180B。以下是有关Falcon180B的一些主要特

LLM 11-环境影响

LLM11-环境影响在本章中,首先提出一个问题:大语言模型对环境的影响是什么?这里给出的一个答案是:气候变化一方面,我们都听说过气候变化的严重影响(文章1、文章2):我们已经比工业革命前的水平高出1.2°C需要保持在1.5°C以下以避免气候危机根据目前的轨迹,在未来几十年内将达到2.7°C另一方面,我们看到训练大语言模

热文推荐