У меня есть Flex swf, размещенный на http://www.a.com/a.swf. У меня есть флэш-код на другом doamin, который пытается загрузить 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()
Есть ли способ заставить этот код работать?





Может быть, System.Security.allowDomain - это то, что вам нужно?
Все это описано в Программа Adobe Flex 3 ActionScript 3 PDF на странице 550 (Глава 27: Безопасность Flash Player / Межсетевое взаимодействие):
If two SWF files written with ActionScript 3.0 are served from different domains—for example, http://siteA.com/swfA.swf and http://siteB.com/swfB.swf—then, by default, Flash Player does not allow swfA.swf to script swfB.swf, nor swfB.swf to script swfA.swf. A SWF file gives permission to SWF files from other domains by calling Security.allowDomain(). By calling Security.allowDomain("siteA.com"), swfB.swf gives SWF files from siteA.com permission to script it.
Это продолжается более подробно, с диаграммами и всем остальным.
Вам понадобится файл политики 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/