Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Как передать сессию из php во flash? (http://www.flasher.ru/forum/showthread.php?t=198369)

ImPuLsE 25.04.2013 10:27

Как передать сессию из php во flash?
 
Всем здравствуйте!
Ситуация следующая:
Имеется пару php контроллеров с авторизацией... на странице одного из них есть флешка которая считывает xml файлик. Так вот когда я авторизовываюсь флешка подгружает не сам xml а естественно страницу авторизации с логином и паролем (в контроллере происходит редирект на авторизацию, если пользователь не авторизован). И сам вопрос который уже прозвучал в названии темы - "Как передать сессию из php во flash?". Во флеше я пока что не очень, поэтому буду рад самому максимальному разжовыванию...: ) Надеюсь все понятно пояснил.

ну и сам код AS3:

Код AS3:

var info_txt:TextArea = panel_mc.main_mc.info_txt;
 
var grabber:Grabber = new Grabber();
 
function dataGrabbed(event:Event):void
{
        info_txt.text = grabber.data;
}
 
grabber.load("http://flash/func/grabber", "http://flash/func/index");
grabber.addEventListener(Event.COMPLETE, dataGrabbed);

Сам класс Grabber :

Код AS3:

 
public class Grabber extends EventDispatcher
        {
                public var phpFile:String;
                public var remoteFile:String;
                public var req:URLRequest;
                private var vars:URLVariables = new URLVariables();
                private var loader:URLLoader = new URLLoader();
                public var data:String;
 
                public function Grabber()
                {
 
                }
 
                public function load(php:String, remote:String):void
                {
                        phpFile = php;
                        remoteFile = remote;
                        req = new URLRequest(phpFile);
                        vars.fileName = remoteFile;
                        req.data = vars;
                        req.method = URLRequestMethod.POST;
                        loader.load(req);
                        loader.addEventListener(Event.COMPLETE, contentLoaded);
                }
 
                private function contentLoaded(event:Event):void
                {
                        data = loader.data;
                        dispatchEvent(new Event(Event.COMPLETE));
                }
 
        }

В PHP идет echo сгенерированного XML. - Кстати правильно ли что через echo? Или как то еще передавать можно данные через XML во флеш...

Gaen 25.04.2013 11:29

Вам нужно прокинуть id сессии со страницы во флешку через flashvars, и прицепить его к запросу (засунуть в vars)

ImPuLsE 25.04.2013 11:44

Цитата:

Сообщение от Gaen (Сообщение 1131182)
Вам нужно прокинуть id сессии со страницы во флешку через flashvars, и прицепить его к запросу (засунуть в vars)

А не могли бы вы по подробнее про "засунуть в vars" ... желательно код... Заранее благодарен.

caseyryan 25.04.2013 12:13

Если флешка встраивается через SWFObject в страницу, то флешварс передается методу embedSWF седьмым аргументом
Код AS3:

var params = {
        menu: "false",
        scale: "noScale",
        allowFullscreen: "false",
        allowScriptAccess: "always",
        bgcolor: "",
        wmode: "direct"
};
var attributes = {
        id:"Main"
};
var flashvars = { session: "<?php echo $my_session_id; ?>"}; // засовываем ID сессии с помощью php в код страницы
swfobject.embedSWF(
        "Main.swf",
        "altContent", "100%", "100%", "10.0.0",
        "expressInstall.swf",
        flashvars, params, attributes);


ImPuLsE 25.04.2013 14:26

Цитата:

Сообщение от caseyryan (Сообщение 1131185)
Если флешка встраивается через SWFObject в страницу, то флешварс передается методу embedSWF седьмым аргументом
Код AS3:

var params = {
        menu: "false",
        scale: "noScale",
        allowFullscreen: "false",
        allowScriptAccess: "always",
        bgcolor: "",
        wmode: "direct"
};
var attributes = {
        id:"Main"
};
var flashvars = { session: "<?php echo $my_session_id; ?>"}; // засовываем ID сессии с помощью php в код страницы
swfobject.embedSWF(
        "Main.swf",
        "altContent", "100%", "100%", "10.0.0",
        "expressInstall.swf",
        flashvars, params, attributes);


Так а в AS3 что прописать нужно? Если не затруднит то в моем коде...

caseyryan 25.04.2013 18:42

В ас3 в документ классе надо получить ссылку на эти переменные через:
Код AS3:

package {
    public class Main extends Sprite {
            public function Main() {
                  var flashVars:Object = stage.loaderInfo.parameters;
                  trace(flashVars.session); // и тут посмотреть id сессии
            }
    }
}

Хоть в документ классе это делать или нет - не принципиально. Главное чтобы доступ к stage был.
Так же можно использовать ссылку на root вместо stage

chamele0n 25.04.2013 18:57

Цитата:

Сообщение от ImPuLsE (Сообщение 1131183)
"засунуть в vars"

он имеет ввиду что все последующие POST запросы должны содержать id сессии

Код AS3:

public function load(php:String, remote:String):void {
        phpFile = php;
        remoteFile = remote;
        req = new URLRequest(phpFile);
        vars.session_id = session_id;           
        vars.fileName = remoteFile;
        req.data = vars;
        req.method = URLRequestMethod.POST;
        loader.load(req);
        loader.addEventListener(Event.COMPLETE, contentLoaded);
}

я бы еще привязку сессии к ip сделал, но это уже на стороне сервера

ImPuLsE 26.04.2013 10:11

Цитата:

Сообщение от caseyryan (Сообщение 1131279)
В ас3 в документ классе надо получить ссылку на эти переменные через:
Код AS3:

package {
    public class Main extends Sprite {
            public function Main() {
                  var flashVars:Object = stage.loaderInfo.parameters;
                  trace(flashVars.session); // и тут посмотреть id сессии
            }
    }
}

Хоть в документ классе это делать или нет - не принципиально. Главное чтобы доступ к stage был.
Так же можно использовать ссылку на root вместо stage

Добавил я вот сюда :
Код AS3:

var info_txt:TextArea = panel_mc.main_mc.info_txt;
var flashvars:Object = stage.loaderInfo.parameters;
trace(flashvars.session);                 
var grabber:Grabber = new Grabber();

пишет undefined

Даже если каким то чудом у меня получится вывести сессию, то каким образом флешка будет понимать что это именно сессия? какое то условие нужно?

Вот кстати вставка flash:
PHP код:

<script type="text/javascript" src="/css/swfobject.js"></script>
    <script type="text/javascript">
    var flashvars = {session: "<?=session_id();?>"};
    swfobject.embedSWF("swf/05_Remote.swf", "ac", "300", "200", "9.0.0", flashvars);
    </script>
    <div id="ac">
        <a href="http://www.adobe.com/go/getflash">
        <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Загрузить Adobe Flash Player" />
        </a>
    </div>

Что не так подскажите, просто сроки поджимают уже... Или ссылку где почитать... Ну не нашел я ничего про флеш сессии... : (

caseyryan 26.04.2013 10:31

А что эт о ха конструкция?
Код AS3:

"<?=session_id();?>

Вызов метода, но зачем знак равенства? Или я что-то недогоняю?

По идее-то вроде все остальное верно.

kackbip 26.04.2013 11:11

Цитата:

я бы еще привязку сессии к ip сделал, но это уже на стороне сервера
На одном айпишнике может сидеть много хостов. И сессия у всех должна быть разная.

ImPuLsE 26.04.2013 11:11

Цитата:

Сообщение от caseyryan (Сообщение 1131336)
А что эт о ха конструкция?
Код AS3:

"<?=session_id();?>

Вызов метода, но зачем знак равенства? Или я что-то недогоняю?

По идее-то вроде все остальное верно.

Ну Php вместо echo так можно выводить переменную... тут норм всё...

Может еще есть у кого какие варианты по этому поводу, ну очень нужно...

caseyryan 26.04.2013 11:46

А для чего конкретно нужно знать сессию флешке и какой момент это нужно?
В принципе ее можно просто запросом получить от php
Вот в этой http://www.flasher.ru/forum/showthread.php?t=194791 теме я скидывал свой класс Packet, который написал для упрощения создания запросов к серверу.
Соответственно если послать этот пакет серверу
Код AS3:

var packet:Packet = new Packet("getSession", onSession);
private function onSession(params:Object):void {
    var session:String = params.session; // здесь можно принять идентификатор сессии
    trace(session);
}

А в php делаем просто
PHP код:

$method $_POST['method'];
if (
$method == "getSession") {
    echo 
"session=" session_id(); 


Этот вариант точно рабочий. Если не принципиально передать id сессии еще до загрузки (что, как мне кажется, не имеет значения), то можно использовать его

ImPuLsE 26.04.2013 12:18

Цитата:

Сообщение от caseyryan (Сообщение 1131344)
А для чего конкретно нужно знать сессию флешке и какой момент это нужно?

У меня во флешке в текстовом поле подгружается php страница со сгенерированным xml через echo.
В PHP при генерации xml у меня используется айдишник пользователя (который берется из php сессии после авторизации через обычную html форму) для выборки из БД.

Так вот когда я логинюсь через html форму у меня происходит редирект на страницу со флешкой соответсвенно.
Флешка на этой странице подгружает не сам XML а страницу этой html формы... Усли убрать авторизацию в контроллере то грузит структуру XML , но без данных из выборки БД т.к. не авторизован соответсвенно... и не может айди пользователя получить который используется при генерации XML.

Вроде по логике я делаю все в нужной последовательности... Может быть как то через флеш форму авторизации будет проще зделать... я просто не очень осведомлен в этой теме с сессиями....

caseyryan, с вашим пакетом соотнести все сложно пока мне...

Может есть какое то более простое решение? По идее ситуация простейшая....

caseyryan 26.04.2013 13:20

Цитата:

caseyryan, с вашим пакетом соотнести все сложно пока мне...
Почему сложно? В нем не надо ничего дорабатывать. Просто скопировать код пакета в файл с названием Packet.as

А в коде все создается в одну строчку, как я написал выше. Куда уж проще.

Код AS3:

var packet:Packet = new Packet("getSession", onSession); // в любой функции в любом своем классе можно создать новый пакет. Первый параметр, это зазвание метода, который передается пост запросом в php, второй это ссылка на метод, который нужно создать где-либо в своей флешке. Самый лучший вариант - в том же классе, из которого отправляется запрос. 
 
private function onSession(params:Object):void { // вот сам метод обработчик ответа. Он должен содержать только один параметр с типом Object. После ответа от сервера этот метод автоматически дергается через .call() в классе Packet
    var session:String = params.session; // а здесь уже можно принимать URL переменные.
    trace(session);
}


ImPuLsE 26.04.2013 14:33

Да я это уже сделал, я только вот не очень понимаю чем это мне поможет... Что за userID и password ?

Выдает мне :
userId=userId&method=getSession&pass=pass
PACKET DATA: [object Packet]
и дальше тот же html код формы авторизации через которую мне как то надо пройти...

Если убрать авторизацию на контроллере, то выдает:
userId=userId&method=getSession&pass=pass
PACKET DATA: [object Packet] session=

и соответственно ничего... откуда он вообще будет брать сессию в данном случае... Как эти логины и пароли в HTML форме то моей пройдут?

в пакете вашем пишу следующее:
Код AS3:

public class Packet extends EventDispatcher {
 
                public static const HOST:                String                = "http://flash/";
                public static const SCRIPT:                String                = "func/grabber";
                public static var PASS:                        String                = "pass";
                public static var USER_ID:                String                = "userId";

где func/grabber :

PHP код:

$method $_POST['method'];
        if (
$method == "getSession") {
            echo 
"session=" session_id(); 
        } 


caseyryan 26.04.2013 14:40

Цитата:

Что за userID и password ?
Ну это у меня для авторизации используется. Туда данные из соцсетей записываются. Отправку пароля и userId можно вообще убрать, если она не нужна. Просто в моем случае она используется каждый раз.

Вот упрощенный вариант:
Код AS3:

package  {
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IOErrorEvent;
        import flash.events.SecurityErrorEvent;
        import flash.net.URLLoader;
        import flash.net.URLLoaderDataFormat;
        import flash.net.URLRequest;
        import flash.net.URLRequestMethod;
        import flash.net.URLVariables;
 
        public class Packet extends EventDispatcher {
 
                public static const HOST:                String                = "http://server.com/";
                public static const SCRIPT:                String                = "call.php";
 
                private var _callback:                Function        = null;
 
                /**
                *
                * @param        называние метода, который нужно вызывать на сервере, передается в
                * POST с ключом method
                * @param        callback метод который вызывается после прихода ответа от сервера
                * должен принимать один параметр типа Object
                */

                public function Packet(method:String, callback:Function, params:Object = null) {
                        _callback                                = callback;
                        var loader:        URLLoader        = new URLLoader();
                        loader.addEventListener(Event.COMPLETE, onComplete);
                        loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        loader.dataFormat                = URLLoaderDataFormat.VARIABLES;
                        var vars:URLVariables        = new URLVariables();
                        vars['method']                        = method;
                        if (params != null) {
                                for (var i:String in params) {
                                        vars[i] = params[i];
                                }
                        }
                        var rand:        String                = "?" + int(Math.random() * 10000);
                        var request:URLRequest        = new URLRequest(Packet.HOST + Packet.SCRIPT + rand);
                        request.method                        = URLRequestMethod.POST;
                        request.data                        = vars;
                        trace(request.data.toString());
                        try {
                                loader.load(request);
                        } catch (e:Error) {
                                trace(e.getStackTrace());
                        }
 
                }
 
                private function onSecurityError(e:SecurityErrorEvent):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                }
 
                private function onIOError(e:IOErrorEvent):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        trace("INPUT / OUTPUT ERROR");
                }
 
                private function onComplete(e:Event):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        var data:Object = e.target.data as Object;
                        trace("PACKET DATA:", this, unescape(String(data)));
                        if (_callback != null) {
                                _callback.call(null, data);
                        }
                }
        }
}


ImPuLsE 26.04.2013 14:51

Это хорошо что упростилось, проблема остается той же... эх неужели никто не поможет в этой дурацкой проблеме... :(

caseyryan 26.04.2013 14:58

Тогда я не понимаю в чем заключается проблема. В вопросе было как передать id сессии. Так его передать можно. Все остальное уже вопросы для другой темы

chamele0n 26.04.2013 15:41

Цитата:

Сообщение от kackbip (Сообщение 1131339)
На одном айпишнике может сидеть много хостов. И сессия у всех должна быть разная.

я и не говорил что нужно из ip генерировать ключ сессии, просто сделать доп. проверку
Цитата:

Сообщение от caseyryan (Сообщение 1131336)
Код AS3:

"<?=session_id();?>


есть такая конструкция(но не везде работает) развносильна :
PHP код:

<?php print session_id();?>


ImPuLsE 26.04.2013 16:26

Цитата:

Сообщение от caseyryan (Сообщение 1131371)
Тогда я не понимаю в чем заключается проблема. В вопросе было как передать id сессии. Так его передать можно. Все остальное уже вопросы для другой темы

Т.е. при вышеупомянутом описании проблемы (сообщение 13) вы утверждаете что ваш пакет как то мне может помочь? Увы и ах...(

caseyryan 26.04.2013 17:56

Пакет это условность. Грубо говоря это просто запрос к серверу и получение от него ответа "Эй, скажи ка мне id сессии". - "Лови".

Если это не подходит, значит можно попробовать проверять его в html сранице, в которую встроена флешка, и просто запрещать флешке грузиться, если пользователь на авторизован. А саму флешку вообще избавить от этой работы.

ImPuLsE 07.05.2013 11:05

Не могу разобраться с этим http://www.mokrushin.net/post/flash-php-sessions/ Может это как то поможет?


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

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