[AS3]如何绕开AS3安全沙箱进行跨域加载SWF文件
AS3的安全沙箱的确是让人很无奈,本篇文章仅用于解决一个特定的问题,即A服务器上的SWF文件通过http访问B服务器上的SWF文件,此时即使B服务器上设置了crossdomain.xml,也无济于事,B服务器上被加载的SWF文件除必须的crossdomain.xml外,还必须使用Security.allowDomain("*")才能消除安全沙箱(注:我加载的是AS3编写的SWF)。对于无法使用Security.allowDomain("*")的SWF文件,如AVM1的SWF或我们无法编辑被加载的SWF时,我们就可以使用下面这种方式。
使用Loader加载外部SWF文件的时候,如果不出现错误,文件是可以成功加载进来的,只不过是在使用该SWF文件时,flash会报安全沙箱错误,我们可以使用一种方式绕过该安全沙箱,具体操作如下:
1、首先使用一个Loader加载一个外部SWF,监听Loader.contentLoaderInfo的Event.COMPLETE事件;
2、加载成功后,先暂时不使用这个加载成功的Loader,而是另写一个Loader,使用Loader.loadBytes()来加载第一个Loader的contentLoaderInfo.bytes;
3、在第二个Loader加载成功后,就可以使用被加载的SWF文件了;
示例代码:
- public function load():void
- {
- // 第一个Loader用于使用url加载文件
- var loader1:Loader = new Loader();
- loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, loader1Complete);
- loader1.load(new URLRequest("文件url"));
- }
- private function loader1Complete(event:Event):void
- {
- var loaderinfo:LoaderInfo = event.target as LoaderInfo;
- // 第二个Loader用于加载第一个Loader加载进来的bytes
- var loader2:Loader = new Loader();
- loader2.contentLoaderInfo.addEventListener(Event.COMPLETE, loader2Complete);
- loader2.loadBytes(loaderinfo.bytes);
- }
- private function loader2Complete(event:Event):void
- {
- // 在这里可以使用被加载进来的文件了
- // event.target.content as DisplayObject
- }
注意:使用上面的方式,也应该注意B服务器上有crossdomain.xml文件
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例