Просмотр полной версии : Как передать сессию из php во flash?
Всем здравствуйте!
Ситуация следующая:
Имеется пару php контроллеров с авторизацией... на странице одного из них есть флешка которая считывает xml файлик. Так вот когда я авторизовываюсь флешка подгружает не сам xml а естественно страницу авторизации с логином и паролем (в контроллере происходит редирект на авторизацию, если пользователь не авторизован). И сам вопрос который уже прозвучал в названии темы - "Как передать сессию из php во flash?". Во флеше я пока что не очень, поэтому буду рад самому максимальному разжовыванию...: ) Надеюсь все понятно пояснил.
ну и сам код 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 :
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 во флеш...
Вам нужно прокинуть id сессии со страницы во флешку через flashvars, и прицепить его к запросу (засунуть в vars)
Вам нужно прокинуть id сессии со страницы во флешку через flashvars, и прицепить его к запросу (засунуть в vars)
А не могли бы вы по подробнее про "засунуть в vars" ... желательно код... Заранее благодарен.
caseyryan
25.04.2013, 12:13
Если флешка встраивается через SWFObject в страницу, то флешварс передается методу embedSWF седьмым аргументом
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);
Если флешка встраивается через SWFObject в страницу, то флешварс передается методу embedSWF седьмым аргументом
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 в документ классе надо получить ссылку на эти переменные через:
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
"засунуть в vars"
он имеет ввиду что все последующие POST запросы должны содержать id сессии
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 сделал, но это уже на стороне сервера
В ас3 в документ классе надо получить ссылку на эти переменные через:
package {
public class Main extends Sprite {
public function Main() {
var flashVars:Object = stage.loaderInfo.parameters;
trace(flashVars.session); // и тут посмотреть id сессии
}
}
}
Хоть в документ классе это делать или нет - не принципиально. Главное чтобы доступ к stage был.
Так же можно использовать ссылку на root вместо stage
Добавил я вот сюда :
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:
<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
А что эт о ха конструкция?
"<?=session_id();?>
Вызов метода, но зачем знак равенства? Или я что-то недогоняю?
По идее-то вроде все остальное верно.
я бы еще привязку сессии к ip сделал, но это уже на стороне сервера
На одном айпишнике может сидеть много хостов. И сессия у всех должна быть разная.
А что эт о ха конструкция?
"<?=session_id();?>
Вызов метода, но зачем знак равенства? Или я что-то недогоняю?
По идее-то вроде все остальное верно.
Ну Php вместо echo так можно выводить переменную... тут норм всё...
Может еще есть у кого какие варианты по этому поводу, ну очень нужно...
caseyryan
26.04.2013, 11:46
А для чего конкретно нужно знать сессию флешке и какой момент это нужно?
В принципе ее можно просто запросом получить от php
Вот в этой http://www.flasher.ru/forum/showthread.php?t=194791 теме я скидывал свой класс Packet, который написал для упрощения создания запросов к серверу.
Соответственно если послать этот пакет серверу
var packet:Packet = new Packet("getSession", onSession);
private function onSession(params:Object):void {
var session:String = params.session; // здесь можно принять идентификатор сессии
trace(session);
}
А в php делаем просто
$method = $_POST['method'];
if ($method == "getSession") {
echo "session=" . session_id();
}
Этот вариант точно рабочий. Если не принципиально передать id сессии еще до загрузки (что, как мне кажется, не имеет значения), то можно использовать его
А для чего конкретно нужно знать сессию флешке и какой момент это нужно?
У меня во флешке в текстовом поле подгружается php страница со сгенерированным xml через echo.
В PHP при генерации xml у меня используется айдишник пользователя (который берется из php сессии после авторизации через обычную html форму) для выборки из БД.
Так вот когда я логинюсь через html форму у меня происходит редирект на страницу со флешкой соответсвенно.
Флешка на этой странице подгружает не сам XML а страницу этой html формы... Усли убрать авторизацию в контроллере то грузит структуру XML , но без данных из выборки БД т.к. не авторизован соответсвенно... и не может айди пользователя получить который используется при генерации XML.
Вроде по логике я делаю все в нужной последовательности... Может быть как то через флеш форму авторизации будет проще зделать... я просто не очень осведомлен в этой теме с сессиями....
caseyryan, с вашим пакетом соотнести все сложно пока мне...
Может есть какое то более простое решение? По идее ситуация простейшая....
caseyryan
26.04.2013, 13:20
caseyryan, с вашим пакетом соотнести все сложно пока мне...
Почему сложно? В нем не надо ничего дорабатывать. Просто скопировать код пакета в файл с названием Packet.as
А в коде все создается в одну строчку, как я написал выше. Куда уж проще.
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);
}
Да я это уже сделал, я только вот не очень понимаю чем это мне поможет... Что за 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 форме то моей пройдут?
в пакете вашем пишу следующее:
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 :
$method = $_POST['method'];
if ($method == "getSession") {
echo "session=" . session_id();
}
caseyryan
26.04.2013, 14:40
Что за userID и password ?
Ну это у меня для авторизации используется. Туда данные из соцсетей записываются. Отправку пароля и userId можно вообще убрать, если она не нужна. Просто в моем случае она используется каждый раз.
Вот упрощенный вариант:
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);
}
}
}
}
Это хорошо что упростилось, проблема остается той же... эх неужели никто не поможет в этой дурацкой проблеме... :(
caseyryan
26.04.2013, 14:58
Тогда я не понимаю в чем заключается проблема. В вопросе было как передать id сессии. Так его передать можно. Все остальное уже вопросы для другой темы
chamele0n
26.04.2013, 15:41
На одном айпишнике может сидеть много хостов. И сессия у всех должна быть разная.
я и не говорил что нужно из ip генерировать ключ сессии, просто сделать доп. проверку
"<?=session_id();?>
есть такая конструкция(но не везде работает) развносильна :
<?php print session_id();?>
Тогда я не понимаю в чем заключается проблема. В вопросе было как передать id сессии. Так его передать можно. Все остальное уже вопросы для другой темы
Т.е. при вышеупомянутом описании проблемы (сообщение 13) вы утверждаете что ваш пакет как то мне может помочь? Увы и ах...(
caseyryan
26.04.2013, 17:56
Пакет это условность. Грубо говоря это просто запрос к серверу и получение от него ответа "Эй, скажи ка мне id сессии". - "Лови".
Если это не подходит, значит можно попробовать проверять его в html сранице, в которую встроена флешка, и просто запрещать флешке грузиться, если пользователь на авторизован. А саму флешку вообще избавить от этой работы.
Не могу разобраться с этим http://www.mokrushin.net/post/flash-php-sessions/ Может это как то поможет?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.