网站建设知识

HTML5 跨域信息交互技术之 postMessage

发布: | 发布时间:2013-03-11 12:09

 

我们知道传统的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.  
  14.     var msg = document.getElementById("message").value;
  15.     document.getElementsByTagName("iframe")[0].contentWindow.postMessage(msg,"http://my.bbs.com");
  16.  
  17. }
  18.  
  19. var originWhiteList = ["http://my.bbs.com"];
  20. function checkWhiteList(origin){
  21.     
  22.     for(var i=0; i< originWhiteList.length; i++){
  23.         if(origin == originWhiteList[i]){
  24.             return true;
  25.         }
  26.     }
  27.  
  28.     return false;
  29. }
  30.  
  31. /** 接受消息 */
  32. function messageHandler(e){
  33.     if(checkWhiteList(e.origin)){
  34.         processMessage(e.data);
  35.     }else{
  36.         // ignore message
  37.     }
  38. }
  39.  
  40. function processMessage(d){
  41.     alert(d);
  42. }
  43.  
  44. window.addEventListener("message", messageHandler, true);
  45.  
  46.  
  47.     </script>
  48. </head>
  49. <body>
  50. <h1>您好,我这里是http://www.yuetong.com/</h1>
  51. <input type="text" name="message" id="message" value=""/>
  52. <input type="button" name="handler" value="发生消息" onclick="sendMsg()"/>
  53. <br/>
  54.  
  55. <iframe name="msg" src="http://my.bbs.com/comm_client.html" width="400" height="400"/>
  56. <div></div>
  57. </body>
  58. </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.  
  8. var originWhiteList = ["http://www.yuetong.com"];
  9. function checkWhiteList(origin){
  10.     
  11.     for(var i=0; i< originWhiteList.length; i++){
  12.         if(origin == originWhiteList[i]){
  13.             return true;
  14.         }
  15.     }
  16.  
  17.     return false;
  18. }
  19.  
  20. function messageHandler(e){
  21.  
  22.     if(checkWhiteList(e.origin)){
  23.         processMessage(e.data);
  24.     }else{
  25.         // ignore message
  26.     }
  27. }
  28.  
  29. function processMessage(d){
  30.     var ta = document.getElementsByTagName("textarea")[0].value;
  31.     ta += d + "\n";
  32.     
  33.     document.getElementsByTagName("textarea")[0].value = ta;
  34. }
  35.  
  36. function sendMsg(){
  37.     var msg = document.getElementById("message").value;
  38.     window.top.postMessage(msg,"http://www.yuetong.com");
  39.  
  40. }
  41.  
  42. window.addEventListener("message",messageHandler,true);
  43.  
  44. </script>
  45. </head>
  46. <body>
  47. <h1>您好,我这里是 http://my.bbs.com/</h1>
  48.  
  49. <input type="text" name="message" id="message" value=""/>
  50. <input type="button" name="handler" value="发生消息" onclick="sendMsg()"/>
  51. <textarea name="msg" rows="15" cols="40"></textarea>
  52.  
  53. </body>
  54. </html>


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


配图1

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




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

 

文章转自: 

万唯科技作为唐山地区专业的网络服务提供商,已经为上百家企事业单位提供了网站建设网站制作、网站改版、域名注册、网站空间租用等服务,优质的服务得到了广大客户的一致认可,如果您有网站建设、网站改版、网站维护等方面的需求,请致电:0315-6723159,我们会根据您所从事的行业领域和网站类型,在最短的时间内请我们的营销顾问与您预约后上门拜访您,直接面谈交流为您解答所有的网站建设疑问。

网站建设知识

网站建设| 案例展示| 网站推广| 服务项目| 关于我们| 联系我们| 建站知识| 唐山网络公司博客
  • 热线电话: 0315-6723159
  • 传真:0315-6723159 邮箱:449324@qq.com
  • 公司地址:丰南区瑞景街18号金融中心3层
  • 乘车路线:乘坐80、88、89路车到“欣荣街市场(银丰市场)”站,即到。北方电子对面。
万唯科技最值得信赖的品牌-万唯网络品牌网站建设专家
Copyright © 2012-2013 0315www.com. 万唯科技 版权所有  ICP备案号:冀ICP备12021829号