Доступ к SWF из другого домена - PullRequest
1 голос
/ 20 октября 2010

При попытке загрузить SWF из домена, отличного от домена моего SWF, я получаю эту ошибку:

*** Security Sandbox Violation ***
SecurityDomain 'file:///C:/Documents and Settings/Welcome/My Documents/Flex Builder 3/SwfLoad/bin-debug/SwfLoad.swf' tried to access incompatible context  

    'http://example.com/crossdomain.xml'
loading of class failed. class name is MGroundTileInsideZ1 failure error is SecurityError:  
 Error #2119: Security sandbox violation: caller file:///C:/Documents and Settings/Welcome/My Documents/Flex Builder 3/SwfLoad/bin-debug/SwfLoad.swf   
cannot access LoaderInfo.applicationDomain owned by http://example.com/zoom_assets/GroundTiles.swf.

Вот мой crossdomain.xml:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>

код моего действия:

package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    import flash.system.Security;

    public class SwfLoad extends Sprite
    {
        public function SwfLoad()
        {
            Security.loadPolicyFile("http://example.com/crossdomain.xml");
            var loader:Loader = new Loader();
            var url:String = "http://example.com/zoom_assets/GroundTiles.swf";
            var request:URLRequest = new URLRequest(url);
            var context:LoaderContext = new LoaderContext();
            context.checkPolicyFile = true;
            context.applicationDomain = ApplicationDomain.currentDomain;
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
                    function(e:Event):void {
                        try {
                            var className:String = "MGroundTileInsideZ1";
                           var appDomain:ApplicationDomain = loader.contentLoaderInfo.applicationDomain;
                            var cl:Class = appDomain.getDefinition(className) as Class;
                            //var cl:Class = getDefinitionByName(className) as Class;
                        }
                        catch (e:Error) {
                             trace("loading of class failed. class name is " + className + " failure error is " + e);
                         }
                    });
            loader.load(request,context);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 20 октября 2010
context.securityDomain = SecurityDomain.currentDomain;

Мне тоже пришлось включить вышеприведенную строку ...

И на самом деле я мог бы покончить с:

 Security.loadPolicyFile("http://mydomain.com/crossdomain.xml");

и

 context.checkPolicyFile = true;  
0 голосов
/ 20 октября 2010

Попробуйте выполнить SWF-файл с локального веб-сервера, а не из файловой системы. В Flash Builder перейдите в свойства вашего проекта и выберите «Путь сборки Flex». Измените URL-адрес выходной папки и выходной папки в соответствии с корневым каталогом документа вашего веб-сервера и соответствующим URL-адресом.

Если вам все еще нужно запустить SWF-файл из локальной файловой системы, попробуйте настроить параметры безопасности Flash Player и добавить локальный каталог в список доверенных.

...