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

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

ID:32192701

大小:65.46 KB

页数:4页

时间:2019-02-01

flash在某些多标签浏览器中的“伪沙箱”问题_第1页
flash在某些多标签浏览器中的“伪沙箱”问题_第2页
flash在某些多标签浏览器中的“伪沙箱”问题_第3页
flash在某些多标签浏览器中的“伪沙箱”问题_第4页
资源描述:

《flash在某些多标签浏览器中的“伪沙箱”问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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

2、就可以互相访问了呢?理论上是的,然而实际上却不是。在Chrome、Firefox等非IE浏览器上,是没有问题的。在“纯正”的IE6、IE7、IE8上也是正常的。但是在傲游、360浏览器、腾讯浏览器等基于IE的多标签浏览器中,刷新页面的时候,Flash播放器还是会抛安全沙箱错误。点击访问测试页面。使用上面说的“基于IE的多标签浏览器”访问,你会看到,第一次是正常的,刷新之后就不正常。如果你安装的是debug版本的播放器,可以看到Flash运行时发生了异常。SecurityError:Error#2060:安全沙箱冲突:ExternalInter

3、face调用者http://pnq.cc/temp/test-dmm-crssdmn.swf不能访问http://q.pnq.cc/works/test/test-dmm-crssmn.html。atflash.external::ExternalInterface$/_initJS()atflash.external::ExternalInterface$/call()atMain/start()atMain/init()atMain()Flash的源码:package{importflash.display.Sprite;importfl

4、ash.external.ExternalInterface;importflash.system.Security;importflash.text.TextField;/***Flash缓存造成的伪沙箱问题演示*@authorqhwa*/publicclassMainextendsSprite{publicfunctionMain():void{vartf:TextField=newTextField();tf.text='flashready';tf.autoSize='left';addChild(tf);//允许被所有其他沙箱中的j

5、s或flash调用Security.allowDomain("*");start();}privatefunctionstart():void{//在基于IE的多标签浏览器中,这里运行时可能出错ExternalInterface.call("alert","Hi,flashisready!");ExternalInterface.addCallback('drawCircle',drawCircle);}privatefunctiondrawCircle():void{TextField(getChildAt(0)).appendText('

6、Drawacircle');graphics.beginFill(Math.random()*0xFFFFFF,.5);graphics.drawCircle(Math.random()*stage.stageWidth,Math.random()*stage.stageHeight,50);graphics.endFill();}}}似乎一旦swf是从缓存中读取的,allowScriptAccess这个配置就不起作用?为了验证是不是缓存引起的,我们每次为swf文件地址后面加上随机的数字,发现就不存在上面的问题了。可见这个问题确实是浏览器

7、缓存造成的。为swf文件动态加时间戳或随机数,通过防止缓存可以回避掉这个问题。不过这不是一个很好的方案,因为这会极大增加服务器的压力,并且导致页面加载速度一直都很慢。不过好消息是,目前有个比这个更好的方案:延迟Flash的初始化功能。通过将Flash的ExternalInterface.addCallback时机延后一些,就可以解决这个问题。修改一下Flash的代码,加一个setTimeout:...(略)publicclassMainextendsSprite{publicfunctionMain():void{...(略)//start(

8、);setTimeout(start,500);}...(略)}}测试修改后的效果那么,延迟多少比较合适呢?如果太多,用户会感觉到明显的延迟;太少,一些性能较差的电

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。