2008-08-18 75 views
2

我有一個Flex SWF託管在http://www.a.com/a.swf。 我有另一個doamin試圖加載SWF閃光代碼:如何使用Flash(AS3)從遠程域調用Flex SWF?

_loader = new Loader(); 
var req:URLRequest = new URLRequest("http://services.nuconomy.com/n.swf"); 
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderFinish); 
_loader.load(req); 

在onLoaderFinish事件中,我試圖從遠程SWF加載類和創建它們:

_loader.contentLoaderInfo.applicationDomain.getDefinition("someClassName") as Class 

運行此代碼時我得到以下例外

SecurityError: Error #2119: Security sandbox violation: caller http://localhost.service:1234/flashTest/Main.swf cannot access LoaderInfo.applicationDomain owned by http://www.b.com/b.swf. 
    at flash.display::LoaderInfo/get applicationDomain() 
    at NuconomyLoader/onLoaderFinish() 

有沒有什麼辦法讓這段代碼工作?

回答

6

這一切都是在The Adobe Flex 3 Programming ActionScript 3 PDF 550頁上介紹(第27章:Flash Player安全性/跨腳本):

如果兩個使用ActionScript 3.0編寫不同領域,例如,http://siteA.com/swfA.swf供應SWF文件和http://siteB.com/swfB.swf - 然後,默認情況下,Flash Player不允許swfA.swf腳本swfB.swf,也不允許swfB.swf腳本swfA.swf腳本。 SWF文件通過調用Security.allowDomain()向其他域中的SWF文件提供權限。通過調用Security.allowDomain(「siteA.com」),swfB.swf爲來自siteA.com的SWF文件授予腳本權限。

它繼續在一些更詳細的圖表和所有。

2

你需要有你加載的文件在服務器上的crossdomain.xml策略文件,它看起來應該是這樣的:

<?xml version="1.0"?> 
<!-- http://www.foo.com/crossdomain.xml --> 
<cross-domain-policy> 
    <allow-access-from domain="www.friendOfFoo.com" /> 
    <allow-access-from domain="*.foo.com" /> 
    <allow-access-from domain="105.216.0.40" /> 
</cross-domain-policy> 

把它作爲在爲crossdomain.xml的根您從中加載的域。

還需要設置加載器來讀取這個文件爲這樣:

var loaderContext:LoaderContext = new LoaderContext(); 
loaderContext.checkPolicyFile = true; 

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 
loader.load(new URLRequest("http://my.domain.com/image.png"), loaderContext); 

代碼示例從http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/

yoinked