首页 资讯 电脑入门 操作系统 上网 办公 技巧 硬件 软件 网络 图像 多媒体 程序 数据库 网页网站 网游 安全 加密 企业

Flash在多标签浏览器中互访问题

巧巧电脑网络 2010-11-02  qhwa   收藏此文 
在flash播放器运行时,将不同来源的资源划分到独立的沙箱(sandbox)内,不同沙箱之间不能彼此操作数据(除非目标沙箱做过一些设置,授权其他沙箱可访问),这就是Flash的跨沙箱问题。但是在傲游、360浏览器、腾讯浏览器等基于IE的多标签浏览器中。

Flash在多标签浏览器中互访问题(图一)

Flash播放器运行时,将不同来源的资源划分到独立的沙箱(sandbox)内,不同沙箱之间不能彼此操作数据(除非目标沙箱做过一些设置,授权其他沙箱可访问),这就是Flash的跨沙箱问题。当Flash文件(.swf) 和页面(.html)不在同一个域名下时,如果不经过Flash内部声明System.allowDomain,html无法访问flash定义的接口;不经过html设置allowScriptAccess为’always’,Flash也无法调用页面上的js函数。

那么如果html和flash都设置了互相可以访问,是否Flash和html之间就可以互相访问了呢?理论上是的,然而实际上却不是。

在Chrome、Firefox等非IE浏览器上,是没有问题的。在“纯正”的IE6、IE7、IE8上也是正常的。但是在傲游、360浏览器、腾讯浏览器等基于IE的标签浏览器中,刷新页面的时候,Flash播放器还是会抛安全沙箱错误。

点击访问测试页面

使用上面说的“基于IE的多标签浏览器”访问,你会看到,第一次是正常的,刷新之后就不正常。如果你安装的是debug版本的播放器,可以看到Flash运行时发生了异常。

Flash在多标签浏览器中互访问题(图二)

SecurityError: Error #2060: 安全沙箱冲突:ExternalInterface 调用者 http://pnq.cc/temp/test-dmm-crssdmn.swf不能访问 http://q.pnq.cc/works/test/test-dmm-crssmn.html。

at flash.external::ExternalInterface$/_initJS()

at flash.external::ExternalInterface$/call()

at Main/start()

at Main/init()

at Main()

Flash的源码:

package
{
 import flash.display.Sprite;
 import flash.external.ExternalInterface;
 import flash.system.Security;
 import flash.text.TextField;
 
 /**
  * Flash缓存造成的伪沙箱问题演示
  * @author qhwa
  */
 public class Main extends Sprite
 {
 
  public function Main():void
  {
   var tf:TextField = new TextField();
   tf.text = 'flash ready';
   tf.autoSize = 'left';
   addChild(tf);
 
   //允许被所有其他沙箱中的js或flash调用
   Security.allowDomain("*");
 
   start();
  }
 
  private function start():void
  {
   //在基于IE的多标签浏览器中,这里运行时可能出错
   ExternalInterface.call("alert", "Hi, flash is ready!");
   ExternalInterface.addCallback('drawCircle', drawCircle);
  }
 
  private function drawCircle():void
  {
   TextField(getChildAt(0)).appendText('\nDraw a circle');
 
   graphics.beginFill(Math.random() * 0xFFFFFF, .5);
   graphics.drawCircle(
    Math.random() * stage.stageWidth,
    Math.random() * stage.stageHeight,
    50);
   graphics.endFill();
  }
 
 }
 
}

似乎一旦swf是从缓存中读取的,allowScriptAccess这个配置就不起作用?为了验证是不是缓存引起的,我们每次为swf文件地址后面加上随机的数字,发现就不存在上面的问题了。可见这个问题确实是浏览器缓存造成的。

为swf文件动态加时间戳或随机数,通过防止缓存可以回避掉这个问题。不过这不是一个很好的方案,因为这会极大增加服务器的压力,并且导致页面加载速度一直都很慢。

不过好消息是,目前有个比这个更好的方案:延迟Flash的初始化功能。通过将Flash的ExternalInterface.addCallback时机延后一些,就可以解决这个问题。

拓展阅读:Flash中百叶窗效果的实现

◆作者:闪吧AIYI2003 ◆主页:http://AIYI2003.flash8.net ●前言 前不久写了一篇关于百叶窗效果的教程(两张图片的切换),结果很多朋友通过短信、QQ等来问我,如果是多张图片该怎么办,呵呵,一个人问、两个人问,还可以详详细细的给他们讲一下制作思路与技巧,但问的人实在是太多了。

本类最热图文
Google
巧巧电脑网络编辑信箱  告诉我们您想看的专题或文章