Как вызвать Flex SWF из удаленного домена с помощью Flash (AS3)?

У меня есть 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()

Есть ли способ заставить этот код работать?

18.08.2008 08:53:39
3 ОТВЕТА
РЕШЕНИЕ

Все это описано в документе « Программирование на Adobe Flex 3 в формате PDF на ActionScript 3 на странице 550» (Глава 27: «Безопасность Flash Player / кросс-скриптинг»):

Если два SWF-файла, написанные с помощью ActionScript 3.0, обслуживаются из разных доменов, например, http://siteA.com/swfA.swf и http://siteB.com/swfB.swf , то по умолчанию Flash Player не разрешить swfA.swf для сценария swfB.swf или swfB.swf для сценария swfA.swf. SWF-файл дает разрешение на SWF-файлы из других доменов, вызывая Security.allowDomain (). Вызывая Security.allowDomain ("siteA.com"), swfB.swf дает SWF-файлам с siteA.com разрешение на его создание.

Это продолжается более подробно, с диаграммами и всем.

6
18.08.2008 09:59:50

Mayhaps System.Security.allowDomain - это то, что вам нужно?

0
18.08.2008 09:36:26

Вам понадобится файл политики 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/

2
18.08.2008 10:03:36