Как мне вызвать гибкий SWF-файл из удаленного домена, используя Flash (AS3)?

StackOverflow https://stackoverflow.com/questions/14350

Вопрос

У меня есть гибкий 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()

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

Это было полезно?

Решение

Все это описано в Программный документ Adobe Flex 3 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 разрешение на их создание.

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

Другие советы

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

Возможно Система.Безопасность.Разрешенный домен это то, что вам нужно?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top