`

flex 使用swfLoad注意事项(转)

阅读更多
var swf : SWFLoader = new SWFLoader();

swf.source="test.swf";



如果loader进来的SWF文件用至RemoteObject,只load一个进来是没有问题的,但如果再load一个进来就提示错误:

TypeError: Error #1034: 强制转换类型失败:无法将 mx.messaging.messages::ErrorMessage@392f779 转换为 mx.messaging.messages.ErrorMessage。



解决方法:

var swf : SWFLoader = new SWFLoader();

var lc : LoaderContext = new LoaderContext();
lc.applicationDomain = ApplicationDomain.currentDomain;

swf.loaderContext = lc;

swf.source="test.swf";



要指定SWFloader的loaderContext.loaderContext的说明如下:

包 flash.system
类 public class LoaderContext
继承 LoaderContext   Object
子类 JPEGLoaderContext
语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9
LoaderContext 类提供多种选项,以使用 Loader 类来加载 SWF 文件和其它媒体。LoaderContext 类用作 Loader 类的 load() 和 loadBytes() 方法的 context 参数。



使用 Loader.load() 方法加载 SWF 文件时,需要做出两个决定:应将所加载的 SWF 文件放置到哪个安全域中,以及应放置到该安全域中的哪个应用程序域中? 有关这些选择的更多详细信息,请参阅 applicationDomain 和 securityDomain 属性。



使用 Loader.loadBytes() 方法加载 SWF 文件时,与使用 Loader.load() 时一样,也要选择应用程序域,但不必指定安全域,这是因为 Loader.loadBytes() 始终将其加载的 SWF 文件放置到执行加载的 SWF 文件的安全域。



如果是加载图像(JPEG、GIF 或 PNG)而不是 SWF 文件,则无需指定安全域或应用程序域,这是因为这些概念只对 SWF 有意义。此时您只需做出一个决定:是否需要以编程方式访问所加载图像的像素? 如果需要,请参阅 checkPolicyFile 属性。如果要在加载图像时应用解块,请使用 JPEGLoaderContext 类替代 LoaderContext 类。

公共属性
隐藏继承的公共属性
显示继承的公共属性
属性 定义方
  allowLoadBytesCodeExecution : Boolean = false
指定是否可以使用 Loader 对象的 loadBytes() 方法下载具有可执行代码的内容,如 SWF 文件。
LoaderContext
applicationDomain : ApplicationDomain = null
指定用于 Loader.load() 或 Loader.loadBytes() 方法的应用程序域。
LoaderContext
checkPolicyFile : Boolean = false
指定在开始加载对象本身之前,应用程序是否应该尝试从所加载对象的服务器下载 URL 策略文件。
LoaderContext
constructor : Object
对类对象或给定对象实例的构造函数的引用。
Object
prototype : Object
[静态] 对类或函数对象的原型对象的引用。
Object
securityDomain : SecurityDomain = null
指定用于 Loader.load() 操作的安全域。
LoaderContext

公共方法
隐藏继承的公共方法
显示继承的公共方法
方法 定义方

LoaderContext (checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)
创建带有指定设置的新 LoaderContext 对象。
LoaderContext

hasOwnProperty (name:String ):Boolean
指示对象是否已经定义了指定的属性。
Object

isPrototypeOf (theClass:Object ):Boolean
指示 Object 类的实例是否在指定为参数的对象的原型链中。
Object

propertyIsEnumerable (name:String ):Boolean
指示指定的属性是否存在、是否可枚举。
Object

setPropertyIsEnumerable (name:String , isEnum:Boolean = true):void
设置循环操作动态属性的可用性。
Object

toString ():String
返回指定对象的字符串表示形式。
Object

valueOf ():Object
返回指定对象的原始值。
Object
属性详细信息


  allowLoadBytesCodeExecution 属性
public var allowLoadBytesCodeExecution:Boolean = false

运行时版本: AIR 1.0
指定是否可以使用 Loader 对象的 loadBytes() 方法下载具有可执行代码的内容,如 SWF 文件。在此属性设置为 false (默认值)的情况下,loadBytes() 方法仅限于执行安全操作,如加载图像。

在位于应用程序安全沙箱的 AIR 内容中,默认值为 false 。在非应用程序内容中,默认值为 true 。

注意: 在未来的 AIR 版本中,很可能会替换此 API。发生这种情况时,将需要调整代码以使用新的 API,并在针对新版本的 AIR 发布应用程序之前进行重新编译。

applicationDomain 属性
public var applicationDomain:ApplicationDomain = null

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9
指定用于 Loader.load() 或 Loader.loadBytes() 方法的应用程序域。只应在加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 ActionScript 2.0 编写的 SWF 文件)时才使用此属性。



每 个安全域被分成一个或多个由 ApplicationDomain 对象表示的应用程序域。应用程序域并不是用于安全目的;它们用于管理 ActionScript 代码的协作单元。如果是从其它域加载 SWF 文件,并允许将它放置到另外一个安全域中,则您将无法控制所加载的 SWF 文件被放置到哪个应用程序域中;即使您指定应选择某个应用程序域,也会忽略。但是,如果是将 SWF 文件加载到您自己的安全域中(因为此 SWF 文件来自您自己的域,或者您正在将它导入到您的安全域中),您就可以控制为所加载的 SWF 文件选择哪个应用程序域。



在 LoaderContext.applicationDomain 中,您只可以传递您自己的安全域中的应用程序域。如果试图传递任何其它安全域中的应用程序域,则会引发 SecurityError 异常。



有四种 ApplicationDomain 属性可供您选择使用:

加载器的 ApplicationDomain 的子级。 默认值。可以使用语法 new ApplicationDomain(ApplicationDomain.currentDomain) 显式表示这种选择。这将允许所加载的 SWF 文件直接使用父级的类,例如,可通过编写 new MyClassDefinedInParent() 来使用。但是父级则不能使用此语法;如果父级要使用子级的类,它必须调用 ApplicationDomain.getDefinition() 来检索它们。这种选择的优点是,如果子级定义的类与父级已经定义的类同名,不会出现错误结果;子级只会继承父级对该类的定义,除非子级或父级调用 ApplicationDomain.getDefinition() 方法来检索子级的冲突定义,否则将不使用此定义。
加载器自己的 ApplicationDomain。 使用 ApplicationDomain.currentDomain 时请使用此应用程序域。加载完成后,父级和子级可以直接使用对方的类。如果子级试图定义的类与父级已定义的类同名,则使用父类并忽略子类。
系统 ApplicationDomain 的子级。 使用 new ApplicationDomain(null) 时请使用此应用程序域。这将完全分离加载方和被加载方,从而允许它们使用相同的名称定义各自版本的类并且不会产生冲突或隐藏。一方查看另一方的类的唯一方式是调用 ApplicationDomain.getDefinition() 方法。
其它 ApplicationDomain 的子级。 有时可能会有更复杂的 ApplicationDomain 层次结构。可以将 SWF 文件从您自己的 SecurityDomain 加载到任何 ApplicationDomain 中。例如,new ApplicationDomain(ApplicationDomain.currentDomain.parentDomain.parentDomain) 将 SWF 文件加载到当前域父级的父级的新子级中。
加载完成后,为调用 ApplicationDomain.getDefinition() ,任一方(加载方或被加载方)都可能需要找到它自己的 ApplicationDomain 或另一方的 ApplicationDomain。任一方都可以通过使用 ApplicationDomain.currentDomain 来检索对它自己的应用程序域的引用。执行加载的 SWF 文件可以通过 Loader.contentLoaderInfo.applicationDomain 来检索对被加载的 SWF 文件的 ApplicationDomain 的引用。如果被加载的 SWF 文件知道自己的加载方式,则它可以找到执行加载的 SWF 文件的 ApplicationDomain 对象。例如,如果子级是以默认方式被加载的,则它可以通过使用 ApplicationDomain.currentDomain.parentDomain 找到执行加载的 SWF 文件的应用程序域。



有关详细信息,请参阅《ActionScript 3.0 编程》 中“客户端系统环境”一章的“ApplicationDomain 类”一节。



checkPolicyFile 属性
public var checkPolicyFile:Boolean = false

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9
指定在开始加载对象本身之前,应用程序是否应该尝试从所加载对象的服务器下载 URL 策略文件。此标志适用于 Loader.load() 方法,但不适用于 Loader.loadBytes() 方法。



如果您从执行调用的 SWF 文件所在的域之外加载图像(JPEG、GIF 或 PNG),并且您预计将需要从 ActionScript 访问该图像的内容,请将此标志设置为 true 。访问图像内容的示例包括引用 Loader.content 属性以获得 Bitmap 对象,以及调用 BitmapData.draw() 方法以获得所加载图像像素的副本。如果您在加载时没有指定 checkPolicyFile 就尝试执行这些操作之一,您可能会得到一个 SecurityError 异常,这是因为尚未下载所需的策略文件。



在 LoaderContext.checkPolicyFile 设置为 true 的情况下调用 Loader.load() 方法时,应用程序直到成功下载了相关的 URL 策略文件或发现不存在此类策略文件时才开始下载 URLRequest.url 中的指定对象。Flash Player 或 AIR 首先考虑已经下载的策略文件,然后尝试下载调用 Security.loadPolicyFile() 方法过程中指定的任何待下载策略文件,然后尝试从与 URLRequest.url 对应的默认位置(即 URLRequest.url 所在服务器上的 /crossdomain.xml )下载策略文件。在所有情况下,给定的策略文件必须位于 URLRequest.url (根据策略文件的位置而定),且策略文件必须通过一个或多个 <allow-access-from> 标签允许进行访问。



如果将 checkPolicyFile 设置为 true ,则 Loader.load() 方法中指定的主下载将在完全处理该策略文件之后开始下载。因此,只要您需要的策略文件存在,一旦您收到来自 Loader 对象的 contentLoaderInfo 属性的任何 ProgressEvent.PROGRESS 或 Event.COMPLETE 事件,就说明该策略文件下载已完成,您就可以安全地开始执行需要该策略文件的操作。



如果您将 checkPolicyFile 设置为 true ,并且未找到相关的策略文件,则除非您尝试执行的操作引发了 SecurityError 异常,否则您将不会收到任何错误指示。但是,一旦 LoaderInfo 对象调度 ProgressEvent.PROGRESS 或 Event.COMPLETE 事件,您就可以通过检查 LoaderInfo.childAllowsParent 属性的值来测试是否找到了相关的策略文件。



如果不需要对正在加载的图像进行像素级的访问,则不应将 checkPolicyFile 属性设置为 true 。在这种情况下不必再检查是否存在策略文件,因为这样会延迟下载的开始时间,并且可能会不必要地占用网络带宽。

如果是使用 Loader.load() 方法下载 SWF 文件,也尽量不要将 checkPolicyFile 设置为 true 。这是因为 SWF 到 SWF 的权限不是由策略文件控制的,而是由 Security.allowDomain() 方法控制的,因此在加载 SWF 文件时 checkPolicyFile 不起任何作用。在这种情况下不必再检查是否存在策略文件,因为这样会延迟 SWF 文件的下载,并且可能会不必要地占用网络带宽 (Flash Player 或 AIR 无法判断主下载将是 SWF 文件还是图像,这是因为策略文件下载先于主下载进行。)



如果是从可能使用服务器端 HTTP 重定向的 URL 下载对象,则使用 checkPolicyFile 时要小心。始终从 URLRequest.url 中指定的相应初始 URL 检索策略文件。如果由于 HTTP 重定向而导致最终对象来自其它 URL,则最初下载的策略文件可能不适用于该对象的最终 URL,而最终 URL 对于安全性决策非常重要。如果发现处于这种情况,可以在收到 ProgressEvent.PROGRESS 或 Event.COMPLETE 事件后检查 LoaderInfo.url 的值,它会告诉您该对象的最终 URL。接着,用一个基于该对象的最终 URL 的策略文件 URL 调用 Security.loadPolicyFile() 方法。然后轮询 LoaderInfo.childAllowsParent 的值,直到它变为 true 。

不需要为运行于应用程序沙箱中的 AIR 内容设置此属性。AIR 应用程序沙箱中的内容调用 BitmapData.draw() 方法时可以使用任何已加载的图像内容作为源。



securityDomain 属性
public var securityDomain:SecurityDomain = null

语言版本: ActionScript 3.0
指定用于 Loader.load() 操作的安全域。只应在加载 SWF 文件(而不是图像)时使用此属性。

只有在被加载的 SWF 文件与执行加载的 SWF 文件可能来自不同的域(不同的服务器)时,选择安全域才有意义。从您自己的域加载 SWF 文件时,始终会将它放置到您的安全域中。但是,在从其它域加载 SWF 文件时,您有两种选择: 您可以允许将被加载的 SWF 文件放置到其“自然的”安全域中,此安全域与执行加载的 SWF 文件的安全域不同;这是默认设置。另一种选择是通过将 myLoaderContext.securityDomain 设置为与 SecurityDomain.currentDomain 相同,指出您希望将被加载的 SWF 文件放置到执行加载的 SWF 文件所在的安全域中。这称作导入加载 ,就安全性而言,它等同于将被加载的 SWF 文件复制到您自己的服务器,然后从该服务器加载它。为使导入加载成功完成,被加载的 SWF 文件的服务器必须具有一个策略文件,并且该策略文件必须信任执行加载的 SWF 文件的域。

您只能在 LoaderContext.securityDomain 中传递您自己的安全域。如果试图传递任何其它安全域,则会引发 SecurityError 异常。

AIR 应用程序安全沙箱中的内容无法将其他沙箱中的内容加载到其 SecurityDomain 中。

有关详细信息,请参阅《ActionScript 3.0 编程》 中的“安全性”一章。
http://wgyblog.com
分享到:
评论

相关推荐

    Flex 向 java服务器 上传文件

    Flex是Adobe公司开发的一种富互联网应用程序(RIA)框架,它主要使用ActionScript编程语言和MXML标记语言。在本示例中,我们将讨论如何使用Flex客户端实现文件上传功能,并将其发送到Java服务器。 首先,我们需要...

    flex集成java注意事项

    下面我们将详细探讨在Java与Flex集成过程中需要注意的关键点。 首先,理解Flex与Java的通信机制是至关重要的。Flash Player运行Flex应用程序,它通过HTTP、AMF(Action Message Format)或者WebSocket等协议与...

    Java+flex使用dom4j读写xml

    这个小例子是使用Java作为服务端、Flex做前台,对一个xml文件的读取和写入。 环境:MyEclipse6.0.1+Flex3插件版,jdk1.6,tomcat6.0,dom4j1.6.1,lcds.war, 使用技术:1.Java+flex,及其对象的转换。 2.Java方面...

    css3_flex使用示例

    本资源“css3_flex使用示例”包含了一些关于CSS3 Flexbox的实际应用案例,帮助开发者深入理解和掌握这一强大的布局工具。 1. **Flex容器与项目** - **flex容器**:设置`display`属性为`flex`或`inline-flex`的元素...

    flex 汉字转拼音

    这个"flex汉字转拼音"的主题涉及到Flex应用中处理中文字符并转换为拼音的能力,这对于开发涉及中文语音识别、搜索优化或者用户友好界面等功能的应用程序来说非常有用。 在Flex中,处理汉字转拼音通常需要利用特定的...

    flex与jsp结合使用

    8. **注意事项**:在实际项目中,可能还需要考虑安全性、性能优化、错误处理等问题。例如,使用 BlazeDS 或 LiveCycle Data Services 进行数据传输时,需要配置相应的服务和安全策略。 综上所述,Flex 和 JSP 的...

    Flex 使用中文设备字体 解决办法

    6. **注意事项**:在使用自定义字体时,注意版权问题,确保你有权使用这些字体。另外,过多的字体嵌入可能会影响应用程序的加载速度和大小,因此在选择字体时要权衡性能和视觉效果。 通过以上步骤,你就能成功地在...

    Flex万年历记事本_flex源码

    "Flex万年历记事本"是一个使用Flex技术实现的项目,它结合了日历功能和记事本特性,为用户提供了一种方便的方式来管理和记录日常生活中的事务。 在Flex源码中,我们可以期待看到以下几个关键知识点: 1. **MXML与...

    flex3使用说明

    Flex3 使用说明 Flex3 是一个高效、免费的开源框架,用于构建具有表现力的 Web 应用程序。Flex3 可以与 Java 后台进行通信,并与 FusionCharts 结合使用,实现数据可视化。下面是 Flex3 的详细介绍: 一、Flex ...

    JS与Flex通信、互转例子

    在IT行业中,JavaScript(JS)和Flex是两种广泛使用的前端技术。JS主要应用于浏览器端,负责处理用户交互和动态更新页面,而Flex是基于ActionScript 3(AS3)的开发框架,主要用于创建富互联网应用程序(RIA)。在...

    使用 apache flex mavenizer 将flex sdk 4.6 maven化

    7. **注意事项**:虽然Mavenizer简化了Flex和Java的集成,但需要注意的是,由于Flex技术栈的不断发展,某些较新的特性可能需要寻找其他解决方案,比如迁移到Adobe Animate或使用OpenFL等替代方案。 8. **博文链接**...

    flex 使用swc 包

    标题"flex使用swc包"指的是在Flex开发过程中如何利用SWC文件。SWC文件通常包含以下内容: 1. **ActionScript类**:这些类文件是用ActionScript编写的,可以是自定义的类、接口或抽象类,提供了功能丰富的API供其他...

    flex中使用iframe

    8. **安全注意事项** 由于同源策略的限制,`iframe`加载的网页内容通常只能与相同域下的资源进行交互。如果需要跨域通信,需要在服务器端设置相应的CORS策略。 9. **性能考虑** 使用`iframe`或`WebBrowser`组件...

    flex 官方文档 中文教程

    Flex是基于ActionScript 3.0和Flash Player或Adobe AIR运行时的开发框架,允许开发者使用MXML和ActionScript创建动态、交互式的Web应用。它提供了丰富的UI组件库,能够构建功能强大的图形用户界面。 2. **MXML语言...

    flex 使用手册,官网下载

    Flex 使用手册资源概述 Flex 是一个快速 scanner 生成器,它可以生成词法分析器,用于识别给定的模式。Flex 使用手册是官网下载的官方文档,提供了详细的使用指南和配置选项。 在这个手册中,我们可以了解到 Flex ...

    FLEX特效FLEX特效FLEX特效FLEX特效

    Flex使用MXML和ActionScript编程语言,可以创建交互性强、视觉效果丰富的Web应用程序。在网页设计和开发中,Flex特效是提升用户体验、增强用户界面吸引力的重要手段。 1. **Flex简介**:Flex是基于Flash Player或...

    flex事件flex事件flex事件flex事件

    可以使用`flex-direction`属性来改变它们的方向。 - **对齐方式**:`justify-content`控制主轴上的项目对齐,`align-items`控制侧轴上的项目对齐,`align-self`允许单个项目自定义对齐。 - **弹性因子**:`flex-...

    flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图

    flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图...

    记事万年历flex源码

    通过深入分析这些文件,开发者可以学习到如何使用Flex来构建一个功能齐全且具有视觉吸引力的日历应用。 综上所述,"记事万年历flex源码"是一个展示Flex技术在构建富互联网应用中的实际应用的例子,它融合了UI设计、...

Global site tag (gtag.js) - Google Analytics