HTML5 跨域信息交互技术之 postMessage

转载 2012年03月27日 20:39:25

 我们知道传统的HTML 规范中对于跨域的请求有这严格的限制,如果没有这个限制,将会发生很可怕的事情,设想一个场景当你在公司上班打开公司内部的管理信息系统,同时你打开了另一个外部网页页面, 那个外部网页中的动态脚本比如JS 脚本可以嗅探到你公司内部管理信息系统的内容,假如你公司的信息系统是一些敏感的信息时,其实你在不知不觉中已经泄漏了公司的信息,由此可能将会造成给公司很大的损失,所以浏览器是阻止这些跨域访问。
  但是现实生活中有一些合理的跨域名站点间的交互,读者可能知道 传统HTML 规范中关于跨域的解决方法,
比如 iframe方式、jsonp方式等,今天我要说的是HTML5 中关于跨域数据交互方面的知识。
 
  HTML5中引入了 一个新的API 称为 postMessage ,其实postMessage不管是否有跨域操作, 都建议使用postMessage 来传递消息。
 
  废话不多说,看一个Demo 先。

我们配置两个域名 http://www.yuetong.com/
                 http://my.bbs.com/

在 http://www.yuetong.com/ 域下新建 comm_main.html, 地址 为http://www.yuetong.com/comm_main.html

文件内容如下

  1. <!DOCTYPE html>
  2. <html>
  3. <head>    
  4.     <meta charset="utf-8"/>
  5.     <title>跨站通信 当前域 http://www.yuetong.com</title>
  6.     <script type="text/javascript">
  7. function sendMsg(){
  8.     if(typeof window.postMessage == undefined){
  9.         //
  10.         alert("对不起 您的浏览器不支持 postMessage 特性");
  11.         return false;
  12.     }

  13.     var msg = document.getElementById("message").value;
  14.     document.getElementsByTagName("iframe")[0].contentWindow.postMessage(msg,"http://my.bbs.com");

  15. }

  16. var originWhiteList = ["http://my.bbs.com"];
  17. function checkWhiteList(origin){
  18.     
  19.     for(var i=0; i< originWhiteList.length; i++){
  20.         if(origin == originWhiteList[i]){
  21.             return true;
  22.         }
  23.     }

  24.     return false;
  25. }

  26. /** 接受消息 */
  27. function messageHandler(e){
  28.     if(checkWhiteList(e.origin)){
  29.         processMessage(e.data);
  30.     }else{
  31.         // ignore message
  32.     }
  33. }

  34. function processMessage(d){
  35.     alert(d);
  36. }

  37. window.addEventListener("message", messageHandler, true);


  38.     </script>
  39. </head>
  40. <body>
  41. <h1>您好,我这里是http://www.yuetong.com/</h1>
  42. <input type="text" name="message" id="message" value=""/>
  43. <input type="button" name="handler" value="发生消息" onclick="sendMsg()"/>
  44. <br/>

  45. <iframe name="msg" src="http://my.bbs.com/comm_client.html" width="400" height="400"/>
  46. <div></div>
  47. </body>
  48. </html>

在 http://my.bbs.com/ 域下新建 comm_client.html, 地址 为http://my.bbs.com/comm_main.html,文件内容如下
  1. <!DOCTYPE html>
  2. <html>
  3. <head>    
  4.     <meta charset="utf-8"/>
  5.     <title>跨站通信 当前域 http://my.bbs.com</title>
  6. <script type="text/javascript">

  7. var originWhiteList = ["http://www.yuetong.com"];
  8. function checkWhiteList(origin){
  9.     
  10.     for(var i=0; i< originWhiteList.length; i++){
  11.         if(origin == originWhiteList[i]){
  12.             return true;
  13.         }
  14.     }

  15.     return false;
  16. }

  17. function messageHandler(e){

  18.     if(checkWhiteList(e.origin)){
  19.         processMessage(e.data);
  20.     }else{
  21.         // ignore message
  22.     }
  23. }

  24. function processMessage(d){
  25.     var ta = document.getElementsByTagName("textarea")[0].value;
  26.     ta += d + "\n";
  27.     
  28.     document.getElementsByTagName("textarea")[0].value = ta;
  29. }

  30. function sendMsg(){
  31.     var msg = document.getElementById("message").value;
  32.     window.top.postMessage(msg,"http://www.yuetong.com");

  33. }

  34. window.addEventListener("message",messageHandler,true);

  35. </script>
  36. </head>
  37. <body>
  38. <h1>您好,我这里是 http://my.bbs.com/</h1>

  39. <input type="text" name="message" id="message" value=""/>
  40. <input type="button" name="handler" value="发生消息" onclick="sendMsg()"/>
  41. <textarea name="msg" rows="15" cols="40"></textarea>

  42. </body>
  43. </html>


配图1,当再输入框中输入"你好,朋友" 可以看到iframe窗口中 收到消息。

14356162_1330935582EsS7.jpg
配图1

我们在iframe 窗口中输入“我很好" ,主窗口收到消息并弹出 提示框

14356162_1330935824jOOv.jpg


   其中最为重要 为增加  message 消息的监听和处理, 以及信任站点的配置。

参考文献 : 《Pro HTML5 Programming 》

HTML5 跨域信息交互技术之 postMessage

我们知道传统的HTML 规范中对于跨域的请求有这严格的限制,如果没有这个限制,将会发生很可怕的事情,设想一个场景当你在公司上班打开公司内部的管理信息系统,同时你打开了另一个外部网页页面, 那个外部网页...
  • JackieWell
  • JackieWell
  • 2012年03月06日 15:44
  • 19895

html5跨域通信之postMessage

html5跨域通信之postMessage的用法不同域名下的文档因为安全问题,不允许相互之间文档的访问,但是有的时候却不得不需要这样的操作。因此我们一般可以采用 window.name,hash,或者...
  • i10630226
  • i10630226
  • 2016年05月27日 15:36
  • 902

HTML5-postMessage实现跨域

HTML5-postMessage实现跨域对于使用H5实现跨域,很多人都一直处于半懂状态。知道使用postMessage发送消息,使用onMessage接受消息,但是到底哪个方法应该用window调用...
  • qiqingjin
  • qiqingjin
  • 2016年05月05日 20:35
  • 2228

HTML5 postMessage+iframe实现文件跨域异步上传

HTML5 postMessage+iframe实现文件跨域异步上传前段时间因为项目需求,要实现图片的跨域上传,研究了一番后实现了这个功能,这里做个记录方便日后遇到同样的问题,也给后来者做个参考。目前...
  • jiangsyace
  • jiangsyace
  • 2015年02月17日 00:05
  • 1684

html5的postmessage实现js前端跨域访问及调用解决方案

关于跨域访问,使用JSONP的方法,我前面已经demo过了,具体见http://supercharles888.blog.51cto.com/609344/856886,HTML5提供了一个非常强大的...
  • fuxiaohui
  • fuxiaohui
  • 2014年06月16日 14:35
  • 9897

HTML5 postMessage 消息传输与 POST 跨域通信

目录 [隐藏] 1. postMessage 功能简介 1.1.监听发送过来的消息 1.2.向其他窗体发送消息 2. worker 多线程 3. 跨域 3.1 父窗体创建跨域iframe...
  • u012079603
  • u012079603
  • 2015年03月03日 16:31
  • 2979

跨域通信的几种方式(jsonp,hash,postMessage,websocket,cors)

通信类 // 创建ajax【参考网址】https://segmentfault.com/a/1190000006669043...
  • DLGDark
  • DLGDark
  • 2017年10月01日 17:32
  • 175

HTML5之postMessage和addEventListener实现<iframe>跨域通信

使用postMessage实现跨域的前提条件是一个页面通过调用另一个页面,示例如下所示: 在这个示例中,通过outter.html调用inner.html 这是outter.html func...
  • MOONCOM
  • MOONCOM
  • 2016年11月16日 09:37
  • 1158

用postMessage实现跨域通信

出于要打造一个各个web应用间能够相互联系的生态系统的目标,则需要一种在各个窗口间安全发送消息的方式,利用postMessage()开发正是这样一种方式。 曾经很长一段时间以来,只有遵守相同协议,...
  • kuzuozhou
  • kuzuozhou
  • 2014年04月10日 19:58
  • 1816

HTML5 postMessage解决跨域、跨iframe窗口消息传递

主页面 接收消息: ...
  • u010363836
  • u010363836
  • 2016年03月03日 15:53
  • 3031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HTML5 跨域信息交互技术之 postMessage
举报原因:
原因补充:

(最多只允许输入30个字)