跨域(五)——postMessage

HTML5的postMessage机制是客户端最直接的中档传输方法,一般用在iframe中父页与子页之间的客户端跨域通信。

浏览器支持情况:Chrome 2.0+、Internet Explorer 8.0+, Firefox 3.0+, Opera 9.6+, 和 Safari 4.0+ 。 Facebook已经使用了这个功能,用postMessage支持基于web的实时消息传递。

用法:otherWindow.postMessage(message, targetOrigin)

otherWindow: 对接收信息页面的window的引用。可以是页面中iframe的contentWindow属性;window.open的返回值;通过name或下标从window.frames取到的值。

message: 所要发送的数据,string类型。

targetOrigin: 用于限制otherWindow,“*”表示不作限制

下面是一个基于postMessage的简单聊天实例:

http://www.evil.com:8081/langtao/evil.html页面代码:

<iframe id="ifr" src="http://www.foo.com:8081/langtao/foo.html" width="500" height="300"></iframe>
<div id="msgbox">
</div>
<input type="text" id="msg" />
<input type="button" value="发送" id="btn"/>
<script type="text/javascript">
window.onload = function() {
    document.getElementById(‘btn‘).onclick=function(){
        var ifr = document.getElementById(‘ifr‘);
        var targetOrigin = ‘http://www.foo.com:8081/langtao/‘;  // 若写成http://www.foo.com:8081/langtao/foo.html‘效果一样
        var msg=document.getElementById(‘msg‘).value;
        ifr.contentWindow.postMessage(msg,targetOrigin);

        var c=document.createElement(‘div‘);
        c.innerHTML="你说:"+msg;
        msgbox.appendChild(c);
    }
};
window.addEventListener(‘message‘, function(e){
    // 通过origin属性判断消息来源地址
    if (e.origin == ‘http://www.foo.com:8081‘) {//不可以设置为‘http://www.foo.com:8081/‘
        var c=document.createElement(‘div‘);
        c.innerHTML="来自"+e.origin+"的消息:"+e.data;
        msgbox.appendChild(c);
    }
}, false);
</script>

http://www.foo.com:8081/langtao/foo.html页面代码:

<div id="msgbox">
</div>
<input type="text" id="msg" />
<input type="button" value="发送" id="btn"/>
<script type="text/javascript">
    var msgbox=document.getElementById(‘msgbox‘);
    window.addEventListener(‘message‘, function(e){
        if (e.origin == ‘http://www.evil.com:8081‘) {
            var c=document.createElement(‘div‘);
            c.innerHTML="来自"+e.origin+"的消息:"+e.data;
            msgbox.appendChild(c);
        }
    }, false);
    document.getElementById(‘btn‘).onclick=function(){
        var targetOrigin = ‘http://www.evil.com:8081/langtao/‘;
        var msg=document.getElementById(‘msg‘).value;
        window.top.postMessage(msg, targetOrigin);

        var c=document.createElement(‘div‘);
        c.innerHTML="你说:"+msg;
        msgbox.appendChild(c);
    }
</script>

效果图:

从代码中可以看到,postMessage机制,这种跨域需要双方默契配合,且可以在客户端通过orgin进行判断请求的来源是否合法。

时间: 2024-09-29 23:10:39

跨域(五)——postMessage的相关文章

【h5】h5数据跨域交换postMessage用法

h5数据跨域交换postMessage用法 来源 1.与通过window.open()打开的新窗口跨域数据交换,代码如下: (1)源窗口 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>源窗口</title> 6 </head> 7 <body> 8 <b

跨域传输信息postMessage

widnow.postMessage()方法允许安全的跨域传输. Syntax otherWindow.postMessage(message, targetOrigin, [transfer]); otherWindow 指向另一个窗口的引用:. message 传输给另一个窗口的信息 targetOrigin 一个字符串,指定消息来源(URL形式).记住总是提供一个特定的URL地址如果你知道的话,不要总是使用“*”(针对所有的URL),因为指定一个特定的URL可以防止恶意的网站来攻击. Th

前端跨域的那些事

这一节,我们来讲一讲,前端跨域的那些事,主要分成这样的几部分来讲解, 一.为什么要跨域? 二.常见的几种跨域与使用场景 2.1 JSONP跨域 2.2 iframe跨域 2.3 window.name 跨域 2.4 document.domain 跨域 2.5 cookie跨域 2.6 postMessage跨域 三.总结 一.为什么要跨域 跨域,通常情况下是说在两个不通过的域名下面无法进行正常的通信,或者说是无法获取其他域名下面的数据,这个主要的原因是,浏览器出于安全问题的考虑,采用了同源策略

跨域通信方法总结

本文总结了5种较常见的跨域通信方法,如下: 1)jsonp 2)CORS(Cross OriginResource Sharing,跨源资源共享) 3)主域相同可以设置document.domain 4)利用window.name实现跨域 5)利用window.name实现跨域 jsonp 讲解jsonp之前先看一个例子:假设域A.com上有一个页面a.html,代码如下: var dosomething= function(data){ alert('我是A.com域上的页面,可以被跨域的re

详解js跨域

什么是跨域? 概念:只要协议.域名.端口有任何一个不同,都被当作是不同的域. 对于端口和协议的不同,只能通过后台来解决.URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,

详解JS跨域问题

什么是跨域? 概念:只要协议.域名.端口有任何一个不同,都被当作是不同的域. URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允许 http://www.a

跨域问题总结

先看概念,什么是跨域:协议.域名.端口中有任何一个不同,它们之间要通信就叫跨域. 情形 是否允许通信 同一域名下 是 同一域名下不同文件夹 是 同一域名.不同端口 否 同一域名.不同协议 否 域名和域名对应ip 否 主域名相同.子域名不同 否 不同域名 否 常用的跨域方式有2种:CROS(跨域资源共享Cross-Origin Resource Sharing).JSONP CROS:服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的.如果浏

JavaScript跨域问题总结

什么是跨域? 概念:只要协议.域名.端口有任何一个不同,都被当作是不同的域. URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允许 http://www.a

js跨域问题解决方案

1.JSON-P跨域 动态脚本注入的方法,通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入.所以jsonp是需要服务器端的页面进行相应的配合的. 2.window.name跨域 indow对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个

跨域请求的常用方式及解释

同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个域加载的脚本去获取另一个域上的文档属性.也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同.这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作. js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据. 只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下面介绍几种常用的跨域请求方式 默认端口