相关文章推荐
刚毅的海龟  ·  426 Upgrade Required ...·  3 月前    · 
稳重的八宝粥  ·  基於OCR及深度學習之新聞分類系統 = ...·  1 年前    · 
稳重的葫芦  ·  甘雨ちゃんに长弓燧龙 ...·  1 年前    · 
坐怀不乱的蚂蚁  ·  不打不相识:陈独秀与袁振英在北大·  1 年前    · 
愉快的电池  ·  师资概况-力学与土木工程学院·  1 年前    · 
活泼的红烧肉  ·  Uninstall & Reinstall ...·  1 年前    · 
Code  ›  iframe+postMessage实现跨域通信开发者社区
云计算 通信 iframe origin
https://cloud.tencent.com/developer/article/1136175
成熟的香烟
3 年前
作者头像
pitaojin
0 篇文章

iframe+postMessage实现跨域通信

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 前端萌媛的成长之路 > iframe+postMessage实现跨域通信

iframe+postMessage实现跨域通信

作者头像
pitaojin
发布 于 2018-05-25 16:52:30
1.5K 1
发布 于 2018-05-25 16:52:30
举报

前言

需求背景:

最近开发管理系统,需要在本页面跳转到一个图片管理系统上传图片,上传成功后返回图片链接,然后返回管理系统,显示图片

实现思路:

  1. 上传图片时,需要在本窗口跳转到图片管理系统,并且两个系统之间要通信
  2. 考虑到两个系统是不同的端口号,存在跨域问题,这时发现HTML5新增了一个API-window.postMessage(),于是就决定用iframe结合window.postMessage()实现
  3. 在页面中嵌入一个iframe,将图片管理系统嵌入到当前的管理系统中,结合window.postMessage()实现跨域通信

项目背景

  • 该管理系统基于React.js搭建,在此简称为A页面,地址为 http://www.blogoog.com:8000
  • 图片管理系统基于Vue.js搭建,在此简称为B页面,地址为 http://www.blogoog.com:8088

具体实现

参考资料

  • iframe-MDN: https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe
  • window.postMessage()-MDN: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage

1、A页面使用到的语法

window.postMessage()

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

  • otherWindow:其他窗口的一个引用(在这里我使用了iframe的contentWindow属性)
  • message:将要发送到其他window的数据(可以不受限制的将数据对象安全的传送给目标窗口而无需自己序列化,原因是因为采用了结构化克隆算法: https://developer.mozilla.org/zh-CN/docs/Web/Guide/API/DOM/The_structured_clone_algorithm )
  • targetOrigin:接收信息的URL(在这里我当然填的B页面的URL)
  • transfer:可选参数(在这里我没使用)

具体参考: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage

window.addEventListener('message', receiveMessage, false);

target.addEventListener(type, listener, options);

  • type:表示监听事件类型的字符串
  • listener:当所监听的事件类型触发时,会通知的一个对象或者一个函数
  • potions:可选参数(在此我用false,表示在listener被调用之后不会自动移除)

具体参考: https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener

receiveMessage = (event) => {}

  • event.data:从另一个window传递过来的对象(包含传递过来的所有信息)
  • event.origin||event.originalEvent.origin:window.postMessage()发送消息的目标URL
  • event.source:对发送消息的窗口对象的引用

注意点!!!

  • 在页面内嵌入iframe页面的情况下,需要等到页面内的iframe页面,也就是B页面加载完成之后,才能进行postMessage跨域通信
  • event.origin中的origin不能保证是该窗口的当前origin或者未来origin,因为postMessage被调用后,可能会被导航到不同的位置,所以需要做个异常情况判断处理 origin !== 'http://www.blogoog.com:8088'

2、B页面使用到的语法

top.postMessage('data', ' http://www.blogoog.com:8000 ')

  • 参考上面A页面的语法
  • 为什么用top而不用window下面再讲

window.addEventListener('message', receiveMessage, false);

  • 参考上面A页面的语法

receiveMessage = (event) => {}

  • 参考上面A页面的语法

window.postMessage()中的window到底是啥?

始终是你需要通信的目标窗口

  • A页面中:A页面向B页面发送跨域信息,window就是在A页面中嵌入的iframe指向的B页面的window,即: iframe.contentWindow
  • B页面中:B页面想A页面发送跨域信息,window就是A页面的window,在这里因为B页面时嵌入到A页面中的,对于B页面来讲,window就是 top 或者 parent

需要特别注意的坑

  1. 一定要等A页面嵌入的B页面加载完成之后,再进行postMessage跨域通信
  2. 一定要对origin做判断,去掉不是来自我们目标窗口的origin,防止来自其他origin的攻击
  3. 着重注意window.postMessage()中window的用法,明确目标窗口的window

献上代码

A页面

B页面

点击展开阅读全文
本文参与 腾讯云自媒体分享计划 ,分享自作者个人站点/博客。
原始发表:2018.05.16, 如有侵权请联系 cloudcommunity@tencent.com 删除
html5
api
react
vue.js
javascript

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

html5
api
react
vue.js
javascript
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
关于作者
pitaojin
0
文章
0
累计阅读量
0
获赞
前往专栏
目录
  • 前言
    • 需求背景:
      • 实现思路:
        • 项目背景
        • 具体实现
          • 参考资料
            • 1、A页面使用到的语法
              • window.postMessage()
              • window.addEventListener('message', receiveMessage, false);
              • receiveMessage = (event) => {}
            • 注意点!!!
              • 2、B页面使用到的语法
                • top.postMessage('data', 'http://www.blogoog.com:8000')
                • window.addEventListener('message', receiveMessage, false);
                • receiveMessage = (event) => {}
              • window.postMessage()中的window到底是啥?
              • 需要特别注意的坑
              • 献上代码
                • A页面
                  • B页面
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2023 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
1
 
推荐文章
刚毅的海龟  ·  426 Upgrade Required - HTTP | MDN
3 月前
稳重的八宝粥  ·  基於OCR及深度學習之新聞分類系統 = News Classification System Based On OCR And Deep Learning|Airiti Library 華藝線上圖書館
1 年前
稳重的葫芦  ·  甘雨ちゃんに长弓燧龙 [长弓燧龙]刻晴(原神)中文-手机游戏代理加盟-游戏盒子软件开发_乐游网络科技有限公司
1 年前
坐怀不乱的蚂蚁  ·  不打不相识:陈独秀与袁振英在北大
1 年前
愉快的电池  ·  师资概况-力学与土木工程学院
1 年前
活泼的红烧肉  ·  Uninstall & Reinstall | Git Integration for Jira Cloud
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号