AS3: создание сценария загрузки междоменного домена SWF - PullRequest
0 голосов
/ 21 сентября 2011

У меня странное поведение при загрузке между доменами.Мне нужно предоставить загрузочному SWF-файлу доступ к классам и методам загруженного SWF-файла в разных доменах, но, несмотря на все мои настройки applicationDomain и междоменные настройки, я не могу преобразовать его в пригодный для использования тип в разных доменах, но он работает идеальноdomain.

Сценарий:

Приложение в домене A загружает скин из домена B (фактически вся часть массивной доменной структуры (test.domain.co.uk, assets.domain.co.uk и т. д.), но для целей Flash они различны).В настоящее время некоторые файлы находятся в тестовой среде и пройдут через несколько сред, прежде чем они будут запущены, поэтому я сохраняю все вызовы безопасности относительно свободными.Повсюду есть файлы crossdomain.xml.

код загрузки:

_skinLoader = new Loader();
addChild(_skinLoader);
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
_skinLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, skinError, false, 0, true);
_skinLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, skinLoaded);
var skinurl:String = "http://www.domainB/skins/skin.swf";
var request : URLRequest = new URLRequest(skinurl);
_skinLoader.load(request, context);

ПОЛНЫЙ код события:

onSkinLoaded(e:Event):void{
   addChild(_skinLoader);
   _skin = e.currentTarget.content as ISkin;

   trace("SHELL: Skin loaded:"+_skin); //======== traces out null when x-domain but traces out[object SkinObject] on the same domain or in the IDE
   trace("SHELL: Skin target:"+e.currentTarget.content); //===== traces out [object SkinObject] on both
   ...............

}

Таким образом, он работает, когда обложка находится в том же домене, что и приложение оболочки, но не когда они разделены.Как вы можете заметить из приведенного выше кода, скин реализует ISkin, расширяет и абстрагирует класс ASkin;Чтобы иметь дело с безопасностью, у меня есть следующее как конструктор класса скина (который является базовым классом fla).

public function SkinObject(){
     Security.allowDomain(this.root.loaderInfo.loaderURL);
     super();
}

Другая информация:

  • Следы в скине класса конструктора скина
  • Когда скин находится в том же домене, если я проверяю (e.currentTarget.content is ISkin) Я получаю истину, когда на отдельных доменах я получаю ложь
  • Естьнет событий безопасности
  • Я попытался установить контекст загрузчика для нового ApplicationDomain.

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Хорошо.Я нашел ответ на одной из страниц блестящего сенокулара: http://www.senocular.com/flash/tutorials/contentdomains/?page=1

По сути, проблему можно преодолеть, объединив Домены безопасности двух swfs и установив одинаковый домен applicationDomain.Ниже приведена цитата из вышеприведенной страницы (примеры URL имеют / в них, чтобы они не становились ссылками):

Чтобы загрузить другой SWF-файл в свой собственный домен безопасности, вам необходимо вызвать Loader..load с экземпляром объекта LoaderContext.Свойство securityDomain этого LoaderContext установлено на ссылку на текущий домен безопасности.Это доступно через SecurityDomain.currentDomain.При установке этого значения SWF-загрузчик выражает доверие к SWF-файлу, который должен быть загружен, тогда как этот SWF-файл выражает доверие через файл политики.

h / ttp: //host.example.com/parent.swf:

trace(new LocalConnection().domain); // host.example.com

var loader:Loader = new Loader();

// create a LoaderContext that indicates that
// the loaded SWF will be loaded into this
// security domain
var context:LoaderContext = new LoaderContext(true);
context.securityDomain = SecurityDomain.currentDomain;

var url:String = "http://trusting.example.com/child.swf";
loader.load(new URLRequest(url), context);

h / ttp: //trusting.example.com/crossdomain.xml:

<?xml version="1.0"?> 
<cross-domain-policy>
<allow-access-from domain="host.example.com"/>
</cross-domain-policy>

h / ttp: //trusting.example.com/child.swf:

trace(new LocalConnection().domain); // host.example.com

Используя свойство домена экземпляра LocalConnection, домен безопасности проверяется для каждого SWF-файла.Хотя дочерний SWF-файл возник из домена trusting.example.com, он показан как находящийся в домене host.example.com, поскольку родительский SWF-файл загрузил его в свой собственный домен безопасности.

Я надеюсь, чтопомогает кому-то провести 3 дня в кругах. Спасибо, сенокуляр!

1 голос
/ 21 сентября 2011

Эта строка кода не будет делать то, что вы ожидаете:

Security.allowDomain (this.root.loaderInfo.loaderURL);

Я почти уверен, что корневой URL-адрес swf, который вы загружаете из домена B в A, все равно будет доменом B, иначе система политики междоменного доступа вообще не будет работать, потому что любые / все swfs загрузка из домена X в домен автоматически становится дочерней по отношению к домену A (с этой логикой).

Вам нужно написать файл политики междомена и поместить его как в домен A, так и в домен B, предоставив явное разрешение домену B взаимодействовать с A, а A с B. Вот пример файла политики междомена, который предоставит разрешение любому, кто загружает swfs в домен.

<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

Взято из этого вопроса / ответа:

Может кто-нибудь опубликовать правильно сформированный пример crossdomain.xml?

0 голосов
/ 21 сентября 2011

DomainA swf: при загрузке swf из domainB загружается файл crossdomain.xml из domainB.если это не поможет, то:

внутри SWF на домене A добавьте:

System.allowDomain ( 'DomainB' );

crossdomain.xml, в основном необходимый для изображений / видео и других типов файлов.Swf; s нужно позаботиться отдельно:

внутри SWF на DomainB добавить:

System.allowDomain ( 'DomainA' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...