HTML5 跨域信息交互技术之 postMessage

我们知道传统的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. for(var i=0; i< originWhiteList.length; i++){
  19. if(origin == originWhiteList[i]){
  20. return true;
  21. }
  22. }

  23. return false;
  24. }

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

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

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


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

  44. <iframe name="msg" src="http://my.bbs.com/comm_client.html" width="400" height="400"/>
  45. <div></div>
  46. </body>
  47. </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. for(var i=0; i< originWhiteList.length; i++){
  10. if(origin == originWhiteList[i]){
  11. return true;
  12. }
  13. }

  14. return false;
  15. }

  16. function messageHandler(e){

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

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

  26. document.getElementsByTagName("textarea")[0].value = ta;
  27. }

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

  31. }

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

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

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

  40. </body>
  41. </html>


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


配图1

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




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


文章转自: http://blog.chinaunix.net/uid-14356162-id-3111324.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值