Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Простой вопрос по Security (http://www.flasher.ru/forum/showthread.php?t=117003)

homersib 16.10.2008 09:49

Простой вопрос по Security
 
Есть простой код:
Код:

package {
        import flash.display.Sprite;
        import flash.events.SecurityErrorEvent;
       
        public class XMLSocketConnector extends Sprite{
               
                private var _socket:XMLSocket;
               
                public function XMLSocketConnector() {
                        _socket = new XMLSocket();
                        _socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
                        _socket.connect("somehost.com", 1461);
                }
               
                private function securityErrorHandler(event:SecurityErrorEvent):void {
                        //Здесь код обработки события
                }
        }
}

Компилирую. Запускаю swf файл локально в debug плеере (не из IDE). Само собой вылазит ошибка SecurityError: Error #2010: Local-with-filesystem SWF files are not permitted to use sockets.

Вопрос #1: почему не диспатчится событие SecurityErrorEvent.SECURITY_ERROR а вместо вылазиет эта ошибка? То есть код, который написан в хэндлере не выполняется. Ведь в доке у метода XMLSocket.connect() написано:
Цитата:

Events securityError:SecurityErrorEvent — A connect operation attempted to connect to a server outside the caller's security sandbox, and/or to a port lower than 1024. Either problem may be worked around using an XMLSocket policy file on the server.
Конечно, там же написано и это:
Цитата:

Throws SecurityError — Local untrusted SWF files may not communicate with the Internet. This may be worked around by reclassifying this SWF file as local-with-networking or trusted.

SecurityError — You may not specify a socket port higher than 65535.
И если сделать вот так:
Код:

package {
        import flash.display.Sprite;
        import flash.events.SecurityErrorEvent;
       
        public class XMLSocketConnector extends Sprite{
               
                private var _socket:XMLSocket;
               
                public function XMLSocketConnector() {
                        _socket = new XMLSocket();
                        _socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
                        try {
                                _socket.connect("somehost.com", 1461);
                        } catch (error:SecurityError) {
                                //Код обработки ошибки
                        }
                }
               
                private function securityErrorHandler(event:SecurityErrorEvent):void {
                        //Здесь код обработки события
                }
        }
}

То эта ошибка отлавливается. Вопрос #2: Зачем тогда вообще нужно это событие у XMLSocket'а, если нужно ловить SecurityError, а не слушать SecurityErrorEvent.

Gaen 16.10.2008 11:42

1. Там же написано: Throws SecurityError - не dispatches а throws, значит и перехватывать надо через try..catch

2. Насколько я понял, SecurityError и SecurityErrorEvent могут возникать в разных случаях, и один можно отследить сразу (поэтому бросается исключение), а второй - только после того как начнётся процесс коннекта (поэтому нужно отслеживать событие)

Вообще какие проблемы, делаем try..catch и addEventListener и из них обоих вызываем общий обработчик ошибки :)


Часовой пояс GMT +4, время: 20:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.