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方法。
假设下面的模块放在远程服务器上:
当父SWF 加载此模块并初始化事件被触发时,模块将授予加载的SWF文件访问通信权限,并显示已加载模块的URL。
当模块被编译放到远程服务器(这里的域名为moduleserver),一个跨域授权文件被放到域名的根目录,允许appserver的父SWF文件能加载模块:
为了让加载模块的SWF能与被加载模块进行跨脚本通信,你需要调用Security.allowDomain方法,参数为远程服务器域名,以载入crossdomain.xml文件,比如:
主应用程序的初始化事件处理函数调用SecurityDomain.allowDomain方法建立与任何来自moduleserver服务器的资源的通信。应用程序也调用Security.loadPolicyFile方法,Flash Player接收授权文件,确定appserver上的SWF是安全的。使用URLLoader加载跨域授权文件之前必须先调用loadPolicyFile方法,否则会抛出security异常。
当授权文件加载后,主应用程序的<mx:ModuleLoader>实例的url属性被赋值为来自远程服务器的请求模块。应用程序和模块相互授权可互访。
我想加载不同服务器上的模块。
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="absolute" initialize="initHandler();">
<mx:Script>
<![CDATA[
private function initHandler():void{Security.allowDomain( "appserver");}
]]>
</mx:Script>
<mx:Text width="100%" text="{loaderInfo.url}" />
</mx:Module>
layout="absolute" initialize="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="appserver" to-ports="*" />
</cross-domain-policy>
<cross-domain-policy>
<allow-access-from domain="appserver" to-ports="*" />
</cross-domain-policy>
为了让加载模块的SWF能与被加载模块进行跨脚本通信,你需要调用Security.allowDomain方法,参数为远程服务器域名,以载入crossdomain.xml文件,比如:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical" preinitialize="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>
layout="vertical" preinitialize="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属性被赋值为来自远程服务器的请求模块。应用程序和模块相互授权可互访。
加支付宝好友偷能量挖...