HTML5 postMessage和跨域通信

本文介绍了HTML5中的postMessage API如何解决跨域通信的问题,并通过实例展示了如何在不同iframe间进行消息传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTML5 postMessage和跨域通信

http://iknowledge.wikispaces.com/HTML5+postMessage%E5%92%8C%E8%B7%A8%E5%9F%9F%E9%80%9A%E4%BF%A1

 

HTML5 postMessage和跨域通信


 

  • 浏览器的同源策略


    Jesse Ruderman对于同源策略的定义为:“同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性”[1] 。从安全性的角度来说,同源策略认为任何来自其他站点动态装载的内容,其安全性都是不可知的,所以对于浏览器来说,在要求动态内容时,只应该读取同源的HTTP应答和Cookies,而不能读取不同源的内容[2] [3] 。如果两个页面拥有相同的源,它们的协议、端口和主机名都相同,那么可以认为这两个页面是同源的,可以动态的读取对方的信息。


 


 


 


 


 


 


 


 


 


 

  • 跨域通信


    如果WebApp需要从第三方的服务器获取数据,该如何避免同源策略的限制呢?
    已经存在多种方案,客服同源策略的限制,他们包括:
    + 通过iframe实现跨域通信[5]
    + 通过JSONP实现跨域通信[6]
    + 通过设置Ajax通信代理


 

  • HTML5 postMessage() API


    postMessage()是HTML5为了解决现存的跨域问题引入的一个新的API。同源策略的前提是假定任何来自其他站点动态装载的内容,其安全性都是不可知的。postMessage将安全问题的检查抛给了使用者本身,在W3C的官方文档中提到,用户应该在使用前自行确认跨域安全[7]
    API:
    /* 
     * @param message: 需要发送的信息
     * @param targetOrigin: 希望发送到的域名 ('*'代表所有的域,'/'代表只发送给同域目标)
     */
    window.postMessage(message,targetOrigin [, transfer])

    同时在W3C的文档中提到,为了保证postMessage()发送的信息能够被接受到,那么接收端receive message listener的代码应该首先保证被加载和运行。


 

  • Example & Tutorial


    查看了现在网络上流传的例子,一般设计针对两种usecase:


 

  • 1. 一个页面里面加载了两个iframe,一个iframe向另一个发送信息


 

  • +发送端代码:
  •     setTimeout(function(){
            window.parent.frames[1].postMessage('Send message: [Message]','*');
        },1000);
  • +接受端代码:
  •     var onMessageReceived = function(e){
            var msg = e.data;
            alert('Received message: '+msg);
        }
        if (typeof window.addEventListener != 'undefined') {
            window.addEventListener('message', onMessageReceived, false);
        }else if (typeof window.attachEvent != 'undefined') {
            window.attachEvent('onmessage', onMessageReceived);
        };
  • 这里使用了setTimeout延迟1秒是为了保证接收端listener能够首先工作起来。
  • [ Example (已经对js代码做了封装的例子) ]
  • [ Example (未做封装,推荐学习使用) ]


 

  • 2. 一个页面打开一个新的页面,当前页面将信息传递给新的页面
  • 对于这个Usecase来说,具体传送接受的代码没有任何变化,变化的是postMessage的对象,具体请查看Example
  • [ Example ]



 

  • Reference

  1. ^ [ JavaScript的同源策略 ]
  2. ^ [ 浏览器同源策略解释 ]
  3. ^ [ 同源策略 ]
  4. ^ [ 利用HTML5的window.postMessage实现跨域通信 ]
  5. ^ [ 通过iframe实现跨域通信 ]
  6. ^ [ 使用JSONP实现跨域通信 ]
  7. ^ [ W3C postmsg API ]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值