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

У меня есть SWF-файл Flex, размещенный по адресу 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()

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


person Eran Kampf    schedule 18.08.2008    source источник


Ответы (3)


Все это описано в Adobe Flex 3 Programming ActionScript 3 PDF на странице 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 разрешение на их создание сценария.

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

person Theo    schedule 18.08.2008

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

person grapefrukt    schedule 18.08.2008

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

person Rytmis    schedule 18.08.2008