原文:http://www.aliued.cn/?p=3169

在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运行时发生了异常。

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的代码,加一个setTimeout:

public class Main extends Sprite
{public function Main():void{...(略)//start();setTimeout(start, 500);}...(略)}

测试修改后的效果

那么,延迟多少比较合适呢?如果太多,用户会感觉到明显的延迟;太少,一些性能较差的电脑上问题依然存在。根据我一年多总结的经验,500ms是比较合理的数字。目前阿里巴巴中国网站上使用的Flash应用程序,如果有需要和js通信,都是延迟500ms初始化。

顺便说一下,延迟500ms还有另外的一个作用。IE6中,Flash初始化的时候无法得到 stage.stageWidth正确的数字,返回是0(stageHeight也一样)。延迟一点初始化就可以得到正确的数值了。

目前我还没有发现比延迟初始化更好的解决方案,如果你有更好的办法,欢迎交流!

转载于:https://www.cnblogs.com/rialover/archive/2010/11/04/1868782.html

Flash在多标签浏览器中的问题相关推荐

  1. 解决Flash和html在多标签浏览器中互访问题

    在Flash播放器运行时,将不同来源的资源划分到独立的沙箱(sandbox)内,不同沙箱之间不能 彼此操作数据(除非目标沙箱做过一些设置,授权其他沙箱可访问),这就是Flash的跨沙箱问题.当Flas ...

  2. Flash在某些多标签浏览器中的“伪沙箱”问题

    在Flash播放器运行时,将不同来源的资源划分到独立的沙箱(sandbox)内,不同沙箱之间不能彼此操作数据(除非目标沙箱做过一些设置,授权其他沙箱可访问),这就是Flash的跨沙箱问题.当Flash ...

  3. Maxthon,TheWorld,MyIE等多标签浏览器的Flash缓存问题

        因现在越来越多的浏览器在基础用户中占有的份额也越来越大,确实,像Maxthon,TheWorld,MyIE这些浏览器也有它的独到之处,它的某些功能设计更人性化,因为本人不属于那种喜新厌旧的人, ...

  4. video标签支持获取rtsp流么_Flask教程(二十二)在浏览器中播放rtsp实时流

    软硬件环境 windows 10 64bit anaconda3 with python 3.7 pycharm 2020.1.2 flask 1.1.2 opencv 4.4.0 前言 当下,网络摄 ...

  5. Vue:利用Vue生成的网页,在浏览器中的标签页中的图标与标题怎么修改为自己的?

    Vue:利用Vue生成的网页,在浏览器中的标签页中的图标与标题怎么修改为自己的? 在解决这个问题的时候,在网上搜到了许多答案,可以说是众说纷纭,作者结合了多个答案,最后解决了这个问题,下面把用到的资源 ...

  6. 如何在浏览器中显示本地文件系统_如何完全卸载浏览器中的Flash插件

    Flash插件作为浏览器中常用的插件,经常会出现各种问题,需要重新安装,这里就讲一下如何真正卸载浏览器中的Flash插件. 如何下载网页中的swf文件-百度经验​jingyan.baidu.com 适 ...

  7. 如何下载浏览器中的flash 视频

    首先声明,以下仅供参考,所测试所用视频资源,均为开放视频来源. 也就是说,我测试用的视频,都是任何人都可以看的.都是没有任何权限就可以看的.都是开放的视频. 准备工具,任意浏览器,我这里用的是 谷歌c ...

  8. Edge浏览器中不输oneTab的标签整理插件

    搁置标签页插件 当浏览器标签页打开的太多时,一个一个关掉很麻烦,直接关闭浏览器再打开也很反人类,更何况里面可能还有一些需要用到的页面,因此就很需要一个标签管理插件,将不需要的标签页暂时保存起来,需要的 ...

  9. 关于video标签的视频格式在各个浏览器中的兼容问题

    video为H5新标签,支持三种视频格式:MP4.WebM.Ogg 首先放上成品: 接下来看一下兼容性: 视频格式兼容性: 浏览器video标签兼容性: 可以看出,基本上mp4格式浏览器都兼容,其他两 ...

最新文章

  1. pytorch笔记:VGG 16
  2. P1014Cantor表(找规律)
  3. 当容器应用越发广泛,我们又该如何监测容器?
  4. db2 最近三个月_昙花一现,PA、PC月跌1800,通用料一蹶不振,救不起的塑市!
  5. 用Visual Studio 2019连接 WSL来编译调试C/C++项目
  6. 李宏毅的可解释模型——三个任务
  7. python手枪_Python入门,爬虫训练——枪械查询
  8. python install zabbix.4.0
  9. 华为徐直军:华为云成为智能世界五朵云之一,2021年大力支持伙伴持续创新
  10. OJ1009: 求平均分
  11. binlog和redo log的区别
  12. [UE4]虚幻引擎UE4如何制作可拖动(Drag and Drop)的背包(Scrollbox)(转载)
  13. 约瑟夫问题-sdut
  14. 关于命令行启动MySQL服务的相关问题
  15. android中使用setVideoURI()播放视频
  16. LINQ TO SQL 如何进行增删改查
  17. https抓包与防抓包
  18. 620集成显卡和mx250,独显有必要吗?英特尔UHD620核显对比MX150性能测试
  19. 解决 DOES NOT SUPPORT INDEXING ERROR IN A GO PROGRAM
  20. 老年人怎么办理美国旅游签证?

热门文章

  1. 程序员是世界上最聪明最务实的群体-没有之一
  2. unity的软体系统(布料系统)相关
  3. 洛阳台达服务器维修,fanuc洛阳数控机床维修中心主轴放大器报警故障
  4. 友情链接交易平台网站源码
  5. Two Way Communication Error: Function two_way_comm_post_message / two_way_comm_post_message_ex faile
  6. pcie转sata3硬盘不启动_星三角启动:星型启动正常,转三角型启动后电机异响不转的原因...
  7. 机器学习笔记----最小二乘法
  8. 经典网络结构学习(LeNet-5,AlexNet,VGG,GoogLeNet)
  9. 吴恩达.深度学习系列-C1神经网络与深度学习-W1介绍
  10. 单招自我介绍计算机范文,单招一分钟自我介绍范文