#flash #actionscript-3 #security #flash-cs5 #sandbox
#flash #actionscript-3 #Безопасность #flash-cs5 #изолированная среда
Вопрос:
Hii, я пытаюсь загрузить swf-файл в свое flash-приложение с другого сервера. Когда я пытаюсь загрузить его во flash IDE (crl enter), все работает нормально, но когда я запускаю swf-файл как независимый swf-файл или при его отладке, я получаю эту ошибку:
SecurityError: Error #2121: Security sandbox violation: LoaderInfo.content: file:///C|/Users/something/Desktop/blablabla/myplayer.swf cannot access http://www.somedomain.com/blablabla/lalalala/abc.swf. This may be worked around by calling Security.allowDomain.
at flash.display::LoaderInfo/get content()
at wallplayer_fla::MainTimeline/swfLoaded()[wallplayer_fla.MainTimeline::frame1:216]
Cannot display source code at this location.
У меня есть crossdomain.xml файл в корне моего сервера:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
В «myplayer.swf» у меня есть:
Security.allowDomain("*");
Security.allowInsecureDomain("*");
...
...
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
loaderContext.allowCodeImport = true;
ldr = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded);
ldr.load(new URLRequest(graySwfFilename), loaderContext);
...
...
var mcExt;
var ldr:Loader;
function swfLoaded(e:Event):void {
mcExt = MovieClip(ldr.contentLoaderInfo.content);
ldr.contentLoaderInfo.removeEventListener(Event.COMPLETE, swfLoaded);
mcExt.x = 0;
mcExt.y = 0;
addChild(mcExt);
}
Я действительно не знаю, что делать…
Пожалуйста, помогите?
Ответ №1:
Решение: для Flex 4.x (в настоящее время 4.6) и AS3 во Flash Builder:
import flash.system.SecurityDomain;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
loaderContext.securityDomain = SecurityDomain.currentDomain; // Sets the security
контекст для устранения ошибки # 2121
… теперь загрузите свой SWF с
loader.load(new URLRequest(webServerWebURL),loaderContext);
Ответ №2:
Добавьте свою рабочую папку на панель глобальных настроек безопасности. Это позволяет загружать внешние файлы из одного SWF-файла в вашей файловой системе. То же самое, если вы хотите, чтобы файл.swf загружал b.swf, даже если они расположены в одной папке.
- Перейдите на панель настроек: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html
- Выберите «Добавить местоположение» из выпадающего списка
- Нажмите «Обзор папки» и добавьте папку, содержащую ваш SWF-файл
Это позволит вашему SWF-файлу читать внешние файлы.
Однако это не должно быть проблемой, если вы загружаете свой SWF-файл на сервер.
Комментарии:
1. ВАУ! Спасибо, чувак! Но это решит проблему только на моем компьютере. Если я собираюсь загрузить этот проигрыватель на какой-либо сайт через Интернет, это не исправит проблему … не так ли?
2. Могу ли я достичь тех же результатов при внедрении myplayer.swf на веб-сайте?
3. @hdmi3killer swf-файлы имеют локальные или глобальные ограничения на загрузку. После установки на сервер эти ограничения не влияют на загрузку
4. решение, которое вы мне дали, успешно, когда я запускаю его на своем компьютере в точно указанной папке, но когда я попытался запустить его как встроенный facebook (когда он на моем сервере), ему не удается получить abc.swf. У вас есть какие-нибудь идеи?
5. ХОРОШО .. я понял это! Мне просто нужно было поместить allowDomain в загруженный swf-файл вместо загружаемого swf-файла!!!
Ответ №3:
Ваша ошибка связана с внешним расположением, в котором нет междоменного файла, а не с вами. Ознакомьтесь с этим руководством по использованию файла bridge для связи с внешним API. В этом примере я использовал as3 и php. Хитрость заключается в сохранении контроля над междоменным файлом в вашем домене.Затем позвольте вашему серверу взаимодействовать с api.