22.9.载入来自不同服务器的模块

22.9.1.问题
我想加载不同服务器上的模块。
22.9.2.解决办法
使用flash.system.Security类在主应用程序SWF文件和模块文件之间建立信任机制。
22.9.3.讨论
Flash Player的安全机制是基于域的,SWF文件访问同一个域的数据是不受限制的。当SWF文件载入到Flash Player后,安全沙箱被建立,允许此域的所有资源可被访问。在此模型下请确保SWF是访问外部资源,与来自受信任源的SWF通信。

为了允许指定域的SWF等访问其他域的资源,模块,需要远程服务器有一个跨域授权文件以及在你的应用程序中使用Security.allowDomain方法。要让载入的模块能和父SWF交互---一种跨脚本通信---这个模块也需要调用allowDomain方法。

假设下面的模块放在远程服务器上:
+展开
-XML
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absoluteinitialize="initHandler();">

<mx:Script>
<![CDATA[
private function initHandler():void{Security.allowDomain( "appserver");}

]]>
</mx:Script>
<mx:Text width="100%text="{loaderInfo.url}" />
</mx:Module>

当父SWF 加载此模块并初始化事件被触发时,模块将授予加载的SWF文件访问通信权限,并显示已加载模块的URL。

当模块被编译放到远程服务器(这里的域名为moduleserver),一个跨域授权文件被放到域名的根目录,允许appserver的父SWF文件能加载模块:
+展开
-XML
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="appserverto-ports="*" />
</cross-domain-policy>

为了让加载模块的SWF能与被加载模块进行跨脚本通信,你需要调用Security.allowDomain方法,参数为远程服务器域名,以载入crossdomain.xml文件,比如:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="verticalpreinitialize="initHandler();">

<mx:Script>
<![CDATA[
private function initHandler():void {
Security.allowDomain( "moduleserver");
Security.loadPolicyFile( "http://moduleserver/crossdomain.xml");
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE,loadHandler );
loader.load(new URLRequest("http://moduleserver/crossdomain.xml"));
}
private function loadHandler( evt:Event ):void {
moduleLoader.url = "http://moduleserver/modules/MyModule.swf";
}

]]>
</mx:Script>
<mx:ModuleLoader id="moduleLoader" />
</mx:Application>

主应用程序的初始化事件处理函数调用SecurityDomain.allowDomain方法建立与任何来自moduleserver服务器的资源的通信。应用程序也调用Security.loadPolicyFile方法,Flash Player接收授权文件,确定appserver上的SWF是安全的。使用URLLoader加载跨域授权文件之前必须先调用loadPolicyFile方法,否则会抛出security异常。

当授权文件加载后,主应用程序的<mx:ModuleLoader>实例的url属性被赋值为来自远程服务器的请求模块。应用程序和模块相互授权可互访。

加支付宝好友偷能量挖...


评论(0)网络
阅读(67)喜欢(0)flash/flex/fcs/AIR