HOME
联系方式
付款方式
网站地图
 
沈阳网站制作,沈阳网站建设
沈阳网站建设咨询QQ: 4006558158
沈阳网站建设,立足沈阳,面向企业,您身边的企业信息化服务专家!
盛图快捷导航:模板建站 | 在线订单 | 在线留言
 
首页 关于我们 品牌建站 自助建站 模板建站 域名注册 虚拟主机 可信认证 网站商务通 经典案例 网站推广 联系我们
 
我想咨询网站制作价络 我有网站想给网站改版和维护 我要建网站,请为我提供解决方案 24小时服务QQ: 4006558158
建站知识

一站式服务,让您的网站更具竞争力和影响力!

Flash在某些多标签浏览器中的“伪沙箱”问题
发布日期:2012/8/27
 
阅读次数:856

在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也一样)。延迟一点初始化就可以得到正确的数值了。

( 沈阳网站建设)
友情合作

链接说明:本站接受PR>=4的首页链接,互换链接时,请先做好本站链接,链接联系QQ:4006558158

沈阳师范大学初中生招生
沈阳师范大学自主招生
沈阳工业大学应用本科
武汉自考
沈阳幼师学校
沈阳纸箱厂
沈阳纸箱厂
武汉科技大学自考
福州网站建设
沈阳师范大学独立本科
品牌 · 服务 · 影响力 ——企业信息化服务专家 沈阳域名注册 | 沈阳网站制作 | 沈阳网站建设 | 沈阳网站优化 | 沈阳服务器租用 | 沈阳网站开发 | 沈阳网络公司

盛图服务网络: 沈阳 |  鞍山 | 海城 |  辽阳 |  锦州 | 大连 |  营口 | 丹东 |  朝阳 |  盘锦 |  抚顺 |  铁岭 | 葫芦岛 | 本溪 | 阜新

Tel:4006558158 Email:hhidc@syhhidc.com Fax:024-83992248 Address:沈阳市沈河区青年大街219号华新国际大厦11楼11BC单元

(C)2005-2010 www.syhhidc.com. 沈阳恒昊互联网络有限公司 版权所有 严禁抄袭复制 使用须知 | 著作权声明 辽B-2-3-20060003-19