`
stulpnn
  • 浏览: 68251 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解决ActionScript 3加载swf 跨域问题

    博客分类:
  • Flex
阅读更多
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 as DisplayObject 


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



附:Flash Player的安全模型

您可以加载来自任何可访问源的内容。
如果执行调用的 SWF 文件位于网络沙箱中并且要加载的文件是本地的,则不允许加载。
如果加载的内容为用 ActionScript 3.0 编写的 SWF 文件,那么除非可以通过调用加载的内容文件中的 System.allowDomain() 或 System.allowInsecureDomain() 方法来允许跨脚本排列,否则另一个安全沙箱中的 SWF 文件不能对它执行跨脚本操作。
如果被加载的内容为 AVM1 SWF 文件(用 ActionScript 1.0 或 2.0 编写),则 AVM2 SWF 文件(用 ActionScript 3.0 编写)不能对它执行跨脚本操作。但是,可以通过使用 LocalConnection 类在两个 SWF 文件之间实现通信。
如果被加载的内容为图像,则除非该 SWF 文件的域包含在该图像原始域的跨域策略文件中,否则安全沙箱之外的 SWF 文件无法访问其数据。
在只能与本地文件系统的内容交互的沙箱中的影片剪辑不能对只能与远程内容交互的沙箱中的影片剪辑使用脚本,反之亦然。
分享到:
评论

相关推荐

    加载外部swf

    以下是一个基本的加载SWF文件的步骤: 1. **创建Loader对象**:首先,你需要创建一个`Loader`对象,它是负责加载内容的容器。 ```as3 var loader:Loader = new Loader(); ``` 2. **添加事件监听器**:在加载过程中...

    flash actionscript3 纯AS3代码_资源加载进度条.rar

    在AS3中,加载资源(如图片、音频、视频或SWF文件)是通过`Loader`类来完成的。`Loader`类提供了加载二进制数据、图像、矢量图形等的能力。使用`load()`方法,传入`URLRequest`对象指定要加载的URL,可以开始加载...

    flash actionscript3 从1个SWF中加载另1个SWF 按1播放SWF中的一段 按2播放另一段动画.rar

    综上所述,这个示例主要展示了如何在ActionScript3中使用Loader类加载SWF文件,并通过按钮控制加载的SWF播放不同的动画片段。同时,它还暗示了更复杂的Flex游戏开发中可能涉及的Socket通信技术,尽管在这个具体示例...

    外部加载swf+控制

    4. **安全和性能考虑**: 外部加载SWF可能会引发跨域安全问题,因此需要确保正确的crossdomain.xml策略文件位于服务器上,以允许从其他源加载。此外,大型SWF文件可能影响性能,所以优化加载过程和内容大小是很重要的...

    flash actionscript3游戏开发之 1个swf加载另1个swf并调用其中的元件类.rar

    为了能够调用加载SWF中的特定方法,我们需要确保类具有公开的方法。例如,如果`MyClass`有一个名为`doSomething()`的方法,我们可以这样调用它: ```actionscript instance["doSomething"](); ``` 此外,还要考虑...

    Flash课件制作教程-加载SWF文件

    在AS3(ActionScript 3.0)版本中,加载SWF的操作变得更加规范和高效。以下是一个简单的加载SWF的步骤: 1. **创建Loader对象**:在AS3中,你需要创建一个Loader类的实例,它是负责加载各种类型内容的对象。例如: ...

    flash加载多个SWF

    本文将详细介绍如何在Flash中实现加载多个SWF文件,并提供一种有效的思路来解决这个问题。 首先,理解SWF加载的基本原理是至关重要的。在Flash中,我们可以使用`Loader`类来加载SWF文件。`Loader`类是ActionScript ...

    MP3跨域音频频谱AS3播放器

    【MP3跨域音频频谱AS3播放器】是一种基于Adobe Flash ActionScript 3(AS3)技术开发的多媒体播放器,专为处理跨域音频频谱显示而设计。ActionScript是Flash平台上的编程语言,它允许开发者创建交互式、动画化的Web...

    AS3.0 进度条控制加载的swf

    在AS3.0中,我们通常使用`Loader`类来加载SWF或其他类型的媒体文件。`Loader`对象具有`contentLoaderInfo`属性,这是一个`LoaderInfo`对象,提供了关于加载进度的详细信息。我们可以监听`progress`事件来获取加载...

    flex加载as2写的swf,内容是一个很雷的网页游戏AD

    - 安全限制:跨域加载SWF文件时,需要确保SWF具有正确的跨域策略文件,以防止安全错误。 - 版本兼容:确保你的Flash Player版本能够支持你想要加载的AS2 SWF的所有功能。 - 性能:AS2 SWF在AS3环境中运行可能会...

    Flex控制swf简单源码

    加载SWF文件的核心在于使用`Loader`类,它是AS3中的一个核心组件,负责加载各种类型的媒体资源,包括SWF文件。 以下是一段基本的Flex代码示例,展示了如何加载和控制外部SWF文件: ```actionscript import flash....

    flash+swf+txt调用外部swf文件再调用txt文件

    3. **加载外部SWF文件**:在Flash中,可以使用`Loader`类来加载外部的SWF文件。首先,创建一个Loader对象,然后设置其`load()`方法的目标URL,以加载指定的SWF文件。加载完成后,SWF内容会被嵌入到当前SWF中,可以...

    Actionscript中文帮助文档

    6. **ActionScript与XML/SWF/AAM整合**:ActionScript可以处理XML数据,与SWF(Shockwave Flash)文件进行交互,以及使用Action Message Format(AAM)进行组件通信。 7. **错误处理**:理解如何使用try-catch语句...

    Flex控制外部引用SWF的播放进度源码

    以下是一个基本的加载SWF的示例代码: ```actionscript var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded); loader.load(new URLRequest("path_to_your_...

    加载loader (How to Load External Images in Actionscript 3.0)

    1. **Loader类**:Loader类是ActionScript 3.0中的核心组件,它负责加载各种类型的内容,包括位图(如JPEG、PNG等)、SWF文件以及XML等。我们通过实例化Loader对象,然后调用其load方法来加载外部资源。 2. **加载...

    flash中加载网页

    5. **安全与跨域问题**:加载外部资源时,需要注意浏览器的安全限制。如果HTML文件和SWF不在同一个域下,可能需要设置跨域策略文件以允许数据交换。 6. **优化与性能**:加载网页内容可能会消耗一定的时间和资源,...

    SWF防下载

    3. **禁止嵌入框架**:一些人会通过在iframe中加载SWF来间接下载。我们可以在HTML中使用`<meta>`标签或`no-frame.html`文件来禁止在框架中显示SWF,例如: ```html ``` 或者在`no-frame.html`中设置相应的响应...

    flash swf之间传值

    1. **使用URLVariables和URLRequest**: 当加载SWF时,你可以通过URLVariables附加参数,B.SWF可以通过URLLoader的`data`属性访问这些参数。在A.SWF中: ```as3 var variables:URLVariables = new URLVariables(); ...

    swf 本地通讯

    由于SWF本地通讯涉及到跨域安全问题,Adobe Flash Player对本地连接有以下限制: 1. 不同域的SWF不能直接通信,除非所有SWF都在同一安全沙箱(如同一网站或同一信任文件夹)内。 2. LocalConnection对象的名称必须是...

    使用LocalConnection进行swf之间的数据交互(附helloWorldDemo)

    在Adobe Flash平台上,LocalConnection是AS3(ActionScript 3)提供的一种机制,允许不同的SWF文件在同一台计算机上进行安全的数据通信。这种通信方式在处理跨域问题、实现组件间通信或者创建分布式应用程序时非常...

Global site tag (gtag.js) - Google Analytics