Html5 postMessage实现跨域消息传递


Posted in HTML / CSS onMarch 11, 2016

一、同源策略

    要理解跨域,我们首先要知道什么是同源策略。百度百科上这样定义同源策略:同源策略(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.    <h2>target.html,以下是接收到的消息:</h2>  
  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实现跨域消息传递

   点击发送按钮的时候,target.html将会受到发送的消息。

以上就是本文的全部内容,希望对大家的学习有所帮助。

原文:http://www.cnblogs.com/MarcoHan/p/5245519.html

HTML / CSS 相关文章推荐
基于css3实现漂亮便签样式
Mar 18 HTML / CSS
CSS超出文本指定宽度用省略号代替和文本不换行
May 05 HTML / CSS
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
Jun 28 HTML / CSS
css3编写浏览器背景渐变背景色的方法
Mar 05 HTML / CSS
基于CSS3的animation属性实现微信拍一拍动画效果
Jun 22 HTML / CSS
浅谈HTML5新增及移除的元素
Jun 27 HTML / CSS
通过Canvas及File API缩放并上传图片完整示例
Aug 08 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
Jun 25 HTML / CSS
浅谈HTML5中dialog元素尝鲜
Oct 15 HTML / CSS
canvas压缩图片以及卡片制作的方法示例
Dec 04 HTML / CSS
用CSS3画一个爱心
Apr 27 HTML / CSS
POST提交数据常见的四种方式
Jan 18 HTML / CSS
html5 canvas实现跟随鼠标旋转的箭头
Mar 11 #HTML / CSS
HTML5如何实现元素拖拽
Mar 11 #HTML / CSS
Android本地应用打开方法——通过html5写连接
Mar 11 #HTML / CSS
利用简洁的图片预加载组件提升html5移动页面的用户体验
Mar 11 #HTML / CSS
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
Mar 14 #HTML / CSS
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
Mar 14 #HTML / CSS
HTML5 Canvas绘制文本及图片的基础教程
Mar 14 #HTML / CSS
You might like
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
Prototype Date对象 学习
2009/07/12 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
python中反射用法实例
2015/03/27 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
如何填写个人简历自我评价
2013/12/10 职场文书
历史学专业求职信
2014/06/19 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
浅谈Python数学建模之数据导入
2021/06/23 Python
MySQL 5.7常见数据类型
2021/07/15 MySQL