绕开AS3安全沙箱,跨域加载SWF

简介: AS3的安全沙箱的确是让人很无奈,本篇文章仅用于解决一个特定的问题,即A服务器上的SWF文件通过http访问B服务器上的文件,此时即使B服务器上设置了allowdomain.xml,也无济于事,B服务器上被加载的文件除必须的allowdomain.xml外,还必须使用Security.allowDomain("*")才能消除安全沙箱(注:此时只能是swf文件才能设置,图片等无法设置)。

AS3的安全沙箱的确是让人很无奈,本篇文章仅用于解决一个特定的问题,即A服务器上的SWF文件通过http访问B服务器上的文件,此时即使B服务器上设置了allowdomain.xml,也无济于事,B服务器上被加载的文件除必须的allowdomain.xml外,还必须使用Security.allowDomain("*")才能消除安全沙箱(注:此时只能是swf文件才能设置,图片等无法设置)。对于无法使用Security.allowDomain("*")的文件,我们就可以使用下面这种方式。

使用Loader加载外部文件的时候,如果不出现错误,文件是可以成功加载进来的,只不过是在使用该文件时,flash会报安全沙箱错误,我们可以使用一种方式绕过该安全沙箱,具体操作如下:

1、首先使用一个Loader加载一个外部SWF,监听Loader.contentLoaderInfo的Event.COMPLETE事件;

2、加载成功后,先暂时不使用这个加载成功的Loader,而是另写一个Loader,使用Loader.loadBytes()来加载第一个Loader的contentLoaderInfo.bytes;

3、在第二个Loader加载成功后,就可以使用被加载的文件了;

示例代码:

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 as DisplayObject  

  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 as DisplayObject
  }

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

相关文章
|
1月前
|
缓存 JavaScript 前端开发
一次js请求一般情况下有哪些地方会有缓存处理?
一次js请求一般情况下有哪些地方会有缓存处理?
18 1
|
2月前
|
编解码 JavaScript PHP
文件上传绕过的常见方式
文件上传绕过的常见方式
42 0
|
4月前
|
缓存 JavaScript 网络协议
一次js请求一般情况下有哪些地方会有缓存处理
一次js请求一般情况下有哪些地方会有缓存处理
55 0
|
7月前
|
Web App开发 存储 监控
浏览器基础原理-安全: 渲染进程-安全沙盒
浏览器基础原理-安全: 渲染进程-安全沙盒
37 0
|
Web App开发 存储 缓存
浏览器原理 34 # 安全沙箱
浏览器原理 34 # 安全沙箱
118 1
浏览器原理 34 # 安全沙箱
|
Web App开发 iOS开发
WKWebView接入PDF.js过程记录处理总结
最近用WKWebView读取PDF文件出现字体异常、电子图章不显示的问题,后来查找很多解决方案,最后决定用PDF.js的方式来实现
167 0
|
JavaScript 前端开发
浏览器什么时候会发起网络请求,去加载一张图片?
浏览器什么时候会发起网络请求,去加载一张图片?
231 1
浏览器什么时候会发起网络请求,去加载一张图片?
|
前端开发
前端解决第三方图片防盗链的办法 - html referrer 访问图片资源403问题
前端解决第三方图片防盗链的办法 - html referrer 访问图片资源403问题
513 0
|
JavaScript 前端开发 PHP
通过js(ajax)请求另外一个域名的接口时会产生跨域问题解决办法
通过js(ajax)请求另外一个域名的接口时会产生跨域问题解决办法
258 0