温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Html5中怎么利用postMessage实现跨域消息传递

发布时间:2021-07-08 16:30:07 来源:亿速云 阅读:131 作者:Leah 栏目:web开发

Html5中怎么利用postMessage实现跨域消息传递,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、同源策略

    要理解跨域,我们首先要知道什么是同源策略。百度百科上这样定义同源策略:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

    何谓同源:如果两个URL的域名、协议、端口相同,则表示他们同源。

    浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性。 (白帽子讲web安全[1])。根据这个策略,a.com域名下的JavaScript无法跨域操作b.com域名下的对象。比如,baidu.com域名下的页面中包含的JavaScript代码,不能访问google.com域名下的页面内容。

    JavaScript必须严格遵循浏览器的同源策略,包括Ajax(事实上,Ajax也是由JavaScript组成)。通过XMLHttpRequest对象实现的Ajax请求,不能向不同的域提交,比如,在abc.test.com下的页面,不能向def.test.com提交Ajax请求。运用了同源策略之后,用户就能确保自己正在查看的页面确实来自于正在浏览的域。

    同源策略在现实应用中是十分重要的。假设攻击者利用Iframe把真正的银行登录页面嵌到他的页面上,当用户使用真实的用户名、密码登录时,该页面就可以通过JavaScript读取到用户表单中的内容,这样用户名和密码信息就被泄漏了。

    在浏览器中,<script>、<link>、<img>、<iframe>等标签都可以加载跨域资源,不受同源策略限制,但是通过src加载的资源,浏览器限制了javascript的权限,不能进行各种的读写。从而,即使请求发了,敏感数据回来了,也是取不到的。

二、postMessage实现跨域

   语法:window.postMessage(msg,targetOrigin)

    window: 指目标窗口,可能是window.frames属性的成员或者由window.open方法创建的窗口

    message:要发送的消息,html5规范中提到该参数可以是JavaScript的任意基本类型或可复制的对象,然而并不是所有浏览器都做到了这点儿,部分浏览器只能处理字符串参数,所以我们在传递参数的时候需要使用JSON.stringify()方法对对象参数序列化,在低版本IE中引用json2.js可以实现类似效果

    targetOrigin:“目标域“,包括:协议、主机名、端口号。若指定为”*“,则表示可以传递给任意窗口,指定为”/“,则表示和当前窗口的同源窗口。

    获取postMessage传来的消息:为页面添加onmessage事件

XML/HTML Code复制内容到剪贴板

  1. window.addEventListener('message',function(e) {   

  2.        

  3. }  

    onmessage事件接受一个参数e,它是一个event对象。

    e的几个重要属性:

      1、data:postMessage传递过来的msg

      2、发送消息的窗口对象

      3、origin:发送消息窗口的源(协议+主机+端口号)

     来写一个简单的demo:

     http://source.com/source.html用来发送数据:

XML/HTML Code复制内容到剪贴板

  1. <iframe id="iframe" src="http://target.com/target.html"></iframe>  

  2. <input id="msg" type="text" placeholder="请输入要发送的消息">  

  3. <button id="send">发送</button>  

  4.   

JavaScript Code复制内容到剪贴板

  1. window.onload =function() {   

  2.     document.getElementById('send').onclick = function() {   

  3.     var msg = document.getElementById('msg').value;   

  4.     var iframeWindow = document.getElementById('iframe').contentWindow;   

  5.     iframeWindow.postMessage(msg,"http://target.com/target.html");   

  6.     }   

  7. }   

     http://target.com/target.html用来接收数据: 

XML/HTML Code复制内容到剪贴板

  1. <div>  

  2.    <h3>target.html,以下是接收到的消息:</h3>  

  3.     <section id="msg">  

  4.            

  5.     </section>  

  6. </div>  

JavaScript Code复制内容到剪贴板

  1. window.onload = function() {   

  2.   

  3.     if(window.addEventListener){   

  4.         window.addEventListener("message", handleMessage, false);   

  5.     }   

  6.     else{   

  7.         window.attachEvent("onmessage", handleMessage);   

  8.     }     

  9.   

  10.     function handleMessage(event) {   

  11.         event = event || window.event;   

  12.   

  13.         if(event.origin === 'http://source.com') {   

  14.             document.getElementById('msg').innerHTML = event.data;   

  15.         }   

  16.     }   

  17. }   

  18.   

看完上述内容,你们掌握Html5中怎么利用postMessage实现跨域消息传递的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI