SecurityError: Ошибка № 2122: нарушение изолированной программной среды безопасности: LoaderInfo.content: - PullRequest
0 голосов
/ 07 февраля 2010

Я создаю игру, которая использует файлы листов и xml. Я пытаюсь получить эти файлы с внешнего сервера. Когда я запускаю программу в режиме отладки на моей локальной машине, она прекрасно работает. Но когда я загружаю на сервер. Я получаю эту ошибку

SecurityError: Error #2122: Security sandbox violation: LoaderInfo.content:
A policy file is required, but the checkPolicyFile flag was not set when this media was loaded.

Ниже мой код

private function init():void
        {
            game = new EngineApi();
            gameObject.eApi = game;
            gameObject.EG = this;
            game.Tiling(true,800,640,80,80);
            game.tileEg.offsY = 7000;
            game.tileEg.ScrollLoop(true,0,1,true);//0,1
            context.checkPolicyFile = true;
            flash.system.Security.loadPolicyFile("http://mysite.com/images/tileSheet.png");
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world.xml");//map 0
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world1.xml");//map 1

            flash.system.Security.loadPolicyFile("http://mysite.com/images/world7.xml");//world 7 and 8 are train track maps. map 2
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world8.xml");//map 3
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world9.xml");//Ending of 8 //map 4
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world10spaceInvader.xml");//Beginning of tracks being centered //map 5
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world11LoopBoss.xml");//Tracks loop (you fight boss) //map 6
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world12toDesert.xml");//map 7
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world2.xml");//map 8
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world3.xml");//map 9
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world13DesertDoubleTrain.xml");//map 10
            flash.system.Security.loadPolicyFile("http://mysite.com/images/world14DoubleTrain.xml");//map 11



            game.AddTileSheet("http://mysite.com/images/tileSheet.png");
            game.tw = 80;
            game.th = 80;
            game.LoadTileSheets();

            game.addEventListener("tileLoadComplete", prePareTiles);
            //anything labeled with map (i.e. map 1) is the order of how the game see's it

            game.addXml("http://mysite.com/images/world.xml");//map 0
            game.addXml("http://mysite.com/images/world1.xml");//map 1

            game.addXml("http://mysite.com/images/world7.xml");//world 7 and 8 are train track maps. map 2
            game.addXml("http://mysite.com/images/world8.xml");//map 3
            game.addXml("http://mysite.com/images/world9.xml");//Ending of 8 //map 4
            game.addXml("http://mysite.com/images/world10spaceInvader.xml");//Beginning of tracks being centered //map 5
            game.addXml("http://mysite.com/images/world11LoopBoss.xml");//Tracks loop (you fight boss) //map 6
            game.addXml("http://mysite.com/images/world12toDesert.xml");//map 7
            game.addXml("http://mysite.com/images/world2.xml");//map 8
            game.addXml("http://mysite.com/images/world3.xml");//map 9
            game.addXml("http://mysite.com/images/world13DesertDoubleTrain.xml");//map 10
            game.addXml("http://mysite.com/images/world14DoubleTrain.xml");//map 11
            game.loadXmlMaps();


            clouds = new CloudManager(5);
            clouds.minSpeed = 25;
            clouds.maxSpeed = 35;
            game.addGameChild(clouds);

        }

Ниже в моем классе EngineApi ()

    public function addXml(path:String):void
            {
                xmlDatas.push(path);
            }


public function loadXmlMaps():void
        {
            var gLoader = new gameLoader();
            gLoader.xmlToArray(xmlDatas.shift(),10,100);
            gLoader.addEventListener("xmlComplete", FinishXmlMaps);
        }

        public function FinishXmlMaps(e:Event)
        {
            if(useTiles)
            {
                tileEg.mapHolder.push(gameLoader(e.currentTarget).tileArray);
            }

            if(xmlDatas.length > 0)
            {
                loadXmlMaps();              
            }else
            {
                dispatchEvent(new Event("XMLSCOMPLETE"));
            }
        }

А это код моего класса gameLoader

 public function xmlToArray(s:String, cols:Number, rows:Number):void 
        {
            this.cols = cols;
            this.rows = rows;

            //load in tile sheet image
            var xmlLoader;
            xmlLoader = new URLLoader();
            xmlLoader.addEventListener(Event.COMPLETE, xmlLoadComplete);
            xmlLoader.load(new URLRequest(s));
        }

        private function xmlLoadComplete(e:Event):void
        {
            var mazeData = new XML(e.currentTarget.data) as XML;
            //loop through xml and add rows and columns to aTileMap array
            for (var rowCtr=0;rowCtr<rows;rowCtr++) {
                var tempArray:Array=new Array();

                for (var colCtr=0;colCtr<cols;colCtr++) {
                    tempArray.push(mazeData.tilerow[rowCtr].tilecol[colCtr]);
                }               
                tileArray.push(tempArray);
            }
            trace("xml done");
            dispatchEvent(new Event("xmlComplete"));
        }//END XMLLOAD

Приведенный ниже код в значительной степени представляет собой процесс, через который проходят данные для извлечения и преобразования XML в массив Все работает Я просто получаю сообщение об ошибке, потому что полагаю, что это междоменная проблема. У меня вопрос, как мне его решить.

1 Ответ

3 голосов
/ 07 февраля 2010

Мне кажется, что вы используете функцию Security.loadPolicyFile неправильно. Он предназначен для чтения специальных файлов XML, которые управляют тем, как сервер позволяет Flash Player извлекать данные из него, а не для загрузки изображений или других файлов, как в случае вызова loadPolicyFile ("http://mysite.com/images/tileSheet.png"), который у вас есть.

Вот документация для Security.loadPolicyFile:

http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/system/Security.html#loadPolicyFile()

А вот информация о файлах политики:

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e08.html

Что касается решения междоменных проблем, самый простой способ - поместить файл crossdomain.xml в корень сервера. В нем вы можете указать, какие домены могут получать данные с сервера. Вы можете использовать * для разрешения любого домена. Вот пример файла crossdomain.xml, который позволяет использовать любой домен:

http://api.flickr.com/crossdomain.xml

Flash Player автоматически ищет этот файл, когда это необходимо, и ваш код ActionScript не должен предпринимать каких-либо дополнительных действий самостоятельно.

Использование Security.loadPolicyFile () в первую очередь для ситуаций, когда требуется более контролируемая и / или мелкозернистая политика междоменных доменов, чем эта.

...