HTML5 跨域信息交互技术之 postMessage
2012-07-24 14:20
330 查看
我们知道传统的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
文件内容如下
<!DOCTYPEhtml>
<html>
<head>
<metacharset="utf-8"/>
<title>跨站通信 当前域 http://www.yuetong.com</title>
<scripttype="text/javascript">
function sendMsg(){
if(typeof window.postMessage== undefined){
//
alert("对不起 您的浏览器不支持 postMessage 特性");
return false;
}
var msg
= document.getElementById("message").value;
document.getElementsByTagName("iframe")[0].contentWindow.postMessage(msg,"http://my.bbs.com");
}
var originWhiteList
= ["http://my.bbs.com"];
function checkWhiteList(origin){
for(vari=0;i<
originWhiteList.length;i++){
if(origin
== originWhiteList[i]){
return true;
}
}
return false;
}
/** 接受消息*/
function messageHandler(e){
if(checkWhiteList(e.origin)){
processMessage(e.data);
}else{
// ignore message
}
}
function processMessage(d){
alert(d);
}
window.addEventListener("message", messageHandler,
true);
</script>
</head>
<body>
<h1>您好,我这里是http://www.yuetong.com/</h1>
<inputtype="text"name="message"id="message"value=""/>
<inputtype="button"name="handler"value="发生消息"onclick="sendMsg()"/>
<br/>
<iframename="msg"src="http://my.bbs.com/comm_client.html"width="400"height="400"/>
<div></div>
</body>
</html>
在 http://my.bbs.com/ 域下新建 comm_client.html, 地址 为http://my.bbs.com/comm_main.html,文件内容如下
<!DOCTYPEhtml>
<html>
<head>
<metacharset="utf-8"/>
<title>跨站通信 当前域 http://my.bbs.com</title>
<scripttype="text/javascript">
var originWhiteList
= ["http://www.yuetong.com"];
function checkWhiteList(origin){
for(vari=0;i<
originWhiteList.length;i++){
if(origin
== originWhiteList[i]){
return true;
}
}
return false;
}
function messageHandler(e){
if(checkWhiteList(e.origin)){
processMessage(e.data);
}else{
// ignore message
}
}
function processMessage(d){
var ta
= document.getElementsByTagName("textarea")[0].value;
ta += d+
"\n";
document.getElementsByTagName("textarea")[0].value=
ta;
}
function sendMsg(){
var msg
= document.getElementById("message").value;
window.top.postMessage(msg,"http://www.yuetong.com");
}
window.addEventListener("message",messageHandler,true);
</script>
</head>
<body>
<h1>您好,我这里是 http://my.bbs.com/</h1>
<inputtype="text"name="message"id="message"value=""/>
<inputtype="button"name="handler"value="发生消息"onclick="sendMsg()"/>
<textareaname="msg"rows="15"cols="40"></textarea>
</body>
</html>
配图1,当再输入框中输入"你好,朋友" 可以看到iframe窗口中 收到消息。
配图1
我们在iframe 窗口中输入“我很好" ,主窗口收到消息并弹出 提示框
其中最为重要 为增加 message 消息的监听和处理, 以及信任站点的配置
但是现实生活中有一些合理的跨域名站点间的交互,读者可能知道 传统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
文件内容如下
<!DOCTYPEhtml>
<html>
<head>
<metacharset="utf-8"/>
<title>跨站通信 当前域 http://www.yuetong.com</title>
<scripttype="text/javascript">
function sendMsg(){
if(typeof window.postMessage== undefined){
//
alert("对不起 您的浏览器不支持 postMessage 特性");
return false;
}
var msg
= document.getElementById("message").value;
document.getElementsByTagName("iframe")[0].contentWindow.postMessage(msg,"http://my.bbs.com");
}
var originWhiteList
= ["http://my.bbs.com"];
function checkWhiteList(origin){
for(vari=0;i<
originWhiteList.length;i++){
if(origin
== originWhiteList[i]){
return true;
}
}
return false;
}
/** 接受消息*/
function messageHandler(e){
if(checkWhiteList(e.origin)){
processMessage(e.data);
}else{
// ignore message
}
}
function processMessage(d){
alert(d);
}
window.addEventListener("message", messageHandler,
true);
</script>
</head>
<body>
<h1>您好,我这里是http://www.yuetong.com/</h1>
<inputtype="text"name="message"id="message"value=""/>
<inputtype="button"name="handler"value="发生消息"onclick="sendMsg()"/>
<br/>
<iframename="msg"src="http://my.bbs.com/comm_client.html"width="400"height="400"/>
<div></div>
</body>
</html>
在 http://my.bbs.com/ 域下新建 comm_client.html, 地址 为http://my.bbs.com/comm_main.html,文件内容如下
<!DOCTYPEhtml>
<html>
<head>
<metacharset="utf-8"/>
<title>跨站通信 当前域 http://my.bbs.com</title>
<scripttype="text/javascript">
var originWhiteList
= ["http://www.yuetong.com"];
function checkWhiteList(origin){
for(vari=0;i<
originWhiteList.length;i++){
if(origin
== originWhiteList[i]){
return true;
}
}
return false;
}
function messageHandler(e){
if(checkWhiteList(e.origin)){
processMessage(e.data);
}else{
// ignore message
}
}
function processMessage(d){
var ta
= document.getElementsByTagName("textarea")[0].value;
ta += d+
"\n";
document.getElementsByTagName("textarea")[0].value=
ta;
}
function sendMsg(){
var msg
= document.getElementById("message").value;
window.top.postMessage(msg,"http://www.yuetong.com");
}
window.addEventListener("message",messageHandler,true);
</script>
</head>
<body>
<h1>您好,我这里是 http://my.bbs.com/</h1>
<inputtype="text"name="message"id="message"value=""/>
<inputtype="button"name="handler"value="发生消息"onclick="sendMsg()"/>
<textareaname="msg"rows="15"cols="40"></textarea>
</body>
</html>
配图1,当再输入框中输入"你好,朋友" 可以看到iframe窗口中 收到消息。
配图1
我们在iframe 窗口中输入“我很好" ,主窗口收到消息并弹出 提示框
其中最为重要 为增加 message 消息的监听和处理, 以及信任站点的配置
相关文章推荐
- HTML5 跨域信息交互技术之 postMessage
- HTML5 跨域信息交互技术之 postMessage
- HTML5 跨域信息交互技术之 postMessage
- HTML5 跨域信息交互技术之 postMessage
- HTML5 跨域信息交互技术之 postMessage
- HTML5 跨域信息交互技术之 postMessage
- HTML5 跨域信息交互技术之 postMessage
- HTML5新特性,跨域信息发送方法.postMessage解释
- HTML5 postMessage 跨域窗口信息传递
- html5 postMessage解决跨域、跨窗口消息传递
- 文档型信息交互设计及相关技术实现
- HTML5 postMessage 消息传输与 POST 跨域通信
- 使用HTML5中postMessage实现Ajax中的POST跨域问题
- 有关html5的postMessage跨域发送消息
- 跨域传输信息postMessage
- 跨域信息传递postMessage
- iframe跨域通信--html5.postmessage
- html5 postMessage解决跨域、跨窗口消息传递
- 使用 html5 postMessage 实现跨域
- [HTML5_WebWorkers]利用HTML5的window.postMessage实现跨域通信