宜昌本地软件开发与弱电工程服务商
项目咨询 · 快速响应
您当前的位置: > 博客2 > AS2与AS3技术

[AS3]如何绕开AS3安全沙箱进行跨域加载SWF文件

2016-10-13 00:16:48 点击量:20 标签: 收藏本文

  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文件了;

示例代码:

  1. public function load():void    
  2. {    
  3.     // 第一个Loader用于使用url加载文件     
  4.     var loader1:Loader = new Loader();    
  5.     loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, loader1Complete);    
  6.     loader1.load(new URLRequest("文件url"));    
  7. }    
  8.     
  9. private function loader1Complete(event:Event):void    
  10. {    
  11.     var loaderinfo:LoaderInfo = event.target as LoaderInfo;    
  12.     // 第二个Loader用于加载第一个Loader加载进来的bytes     
  13.     var loader2:Loader = new Loader();    
  14.     loader2.contentLoaderInfo.addEventListener(Event.COMPLETE, loader2Complete);    
  15.     loader2.loadBytes(loaderinfo.bytes);    
  16. }    
  17.     
  18. private function loader2Complete(event:Event):void    
  19. {    
  20.     // 在这里可以使用被加载进来的文件了     
  21.     // event.target.content as DisplayObject     
  22. }   

  注意:使用上面的方式,也应该注意B服务器上有crossdomain.xml文件

ABOUT US
宜昌农人网络科技有限公司

我们是一家提供综合软件外包与弱电工程服务的技术公司。

业务涵盖定制软件、管理系统、网站、小程序、APP、系统集成、网络布线、监控安防、门禁、机房建设及长期技术维护。

公司地址:湖北省宜昌市伍家岗区东站二路6号三峡(宜昌)大数据产业园海洋馆二楼A203室