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

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

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

Ответы [ 3 ]

6 голосов
/ 18 августа 2008

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

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

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

2 голосов
/ 18 августа 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/

0 голосов
/ 18 августа 2008

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

...