Sesión que desaparece en llamadas Ajax

459 views
Skip to first unread message

Fran Iglesias

unread,
Nov 25, 2008, 3:39:46 AM11/25/08
to cakep...@googlegroups.com
Hola,

Tengo una especie de "widget" en un vista que quiero actualizar
mediante una llamada Ajax cada cierto tiempo (uso $ajax->remoteTimer).
Hasta ahí, muy bien.

La acción remota busca ciertas variables en la sesión para obtener el
contexto y filtrar los datos que devuelve.

El problema es que ya no está la sesión.

He mirado por ahí y encuentro que es un problema frecuente. He visto
un par de soluciones, aparte de poner Security en medium y no chequear
el userAgent, que básicamente consisten en reconstruir la sesión:

http://neeocis.wordpress.com/2008/07/02/cakephp-ajaxobservefield-and-session-lost/

http://blogs.bigfish.tv/adam/2008/04/01/cakephp-12-sessions-and-swfupload/

Lo que no acabo de entender es por qué se desvanece la sesión para
Ajax y me gustaría saber si hay otra solución más genérica, ya que las
anteriores más bien requieren llevar controles para cada llamada.

--
Fran Iglesias
fra...@buabua.com


Antonio Hern‡ández Sá‡nchez

unread,
Nov 25, 2008, 10:20:55 AM11/25/08
to cakep...@googlegroups.com
Fran Iglesias escribió:

> La acción remota busca ciertas variables en la sesión para obtener el
> contexto y filtrar los datos que devuelve.
>
> El problema es que ya no está la sesión.
>
> He mirado por ahí y encuentro que es un problema frecuente. He visto
> un par de soluciones, aparte de poner Security en medium y no chequear
> el userAgent, que básicamente consisten en reconstruir la sesión:
>
> http://neeocis.wordpress.com/2008/07/02/cakephp-ajaxobservefield-and-session-lost/
>
> http://blogs.bigfish.tv/adam/2008/04/01/cakephp-12-sessions-and-swfupload/
>

Yo me he encontrado con que a veces, poner la sesión a medium no es
suficiente (sobre todo si quieres pasar la sesión de un subdominio a otro).

Con Ajax no me había pasado, era más bien al hacer redirects, pero a lo
mejor te sirve de ayuda esto:

en app_controller::beforeFilter añade:

if(isset($this->params['named']['id_session'])) {
$this->Session->id($this->params['named']['id_session']);
$this->Session->activate('/');
} else if(isset($this->params['url']['id_session'])) {
$this->Session->id($this->params['url']['id_session']);
$this->Session->activate('/');
}

Y a la llamada añádele el parámetro id_session ya sea por get o como named.

Espero que te sirva, saludos!
--
Antonio

José Lorenzo

unread,
Nov 25, 2008, 10:29:20 AM11/25/08
to cakep...@googlegroups.com
Con solo poner el Security.level en medium, aún tienes problemas?

2008/11/26 Antonio Hern‡ández Sá‡nchez <anton...@gmail.com>

Fran Iglesias

unread,
Nov 25, 2008, 12:34:58 PM11/25/08
to cakep...@googlegroups.com
Hola,

El 26/11/2008, a las 10:59, José Lorenzo escribió:

> Con solo poner el Security.level en medium, aún tienes problemas?

Sí. Lo que no entiendo es ¿por qué?

> 2008/11/26 Antonio Hern‡ández Sá‡nchez <anton...@gmail.com>

> Con Ajax no me había pasado, era más bien al hacer redirects, pero a
> lo
> mejor te sirve de ayuda esto:


estoy probando, pero no consigo que funcione.

La verdad es que no sé dónde mirar.

--
Fran Iglesias
fra...@buabua.com


Antonio Hern‡ández Sá‡nchez

unread,
Nov 27, 2008, 6:26:36 AM11/27/08
to cakep...@googlegroups.com
Fran Iglesias escribió:

Has intentado el tema del beforeFilter? Si es así, y aún tienes
problemas, pega el código que estás utilizando, a ver si conseguimos
averiguar que pasa.

Un saludo
--
Antonio

Fran Iglesias

unread,
Nov 27, 2008, 6:40:32 AM11/27/08
to cakep...@googlegroups.com
Gracias.

El 27/11/2008, a las 12:26, Antonio Hern‡ández Sá‡nchez escribió:

> Has intentado el tema del beforeFilter? Si es así, y aún tienes
> problemas, pega el código que estás utilizando, a ver si conseguimos
> averiguar que pasa.


Sí, probé lo de enviar el id de sesión como parámetro, pero sigue
desaparecida la sesión. De hecho, durante la llamada Ajax se crea una
sesión nueva (si hago debug($session->read()) en la vista, se ve que
se han guardado algunas variables, pero aún no he sido capaz de
determinar todo el proceso). En la navegación estándar se mantiene la
sesión, o sea que es como si hubiera una sesión distinta para el Ajax.

http://code.assembla.com/milhojas/subversion/nodes/dev/app/app_controller.php#ln48

Mi core.php

http://code.assembla.com/milhojas/subversion/nodes/dev/app/config/core.php

El lugar donde debería leerse la sesión

http://code.assembla.com/milhojas/subversion/nodes/dev/app/controllers/minicontrollers/last_post.php

Aunque ahora que lo miro... hay un sitio que no he comprobado y que a
lo mejor provoca el fallo...

http://code.assembla.com/milhojas/subversion/nodes/dev/app/controllers/minicontrollers/mini_controller.php

cuando el minicontroller adquiere el Session Component... igual puedo
intentar otro enfoque y pasarle el contenido de la sesión...

--
Fran Iglesias
fra...@buabua.com


José Lorenzo

unread,
Nov 27, 2008, 7:54:37 AM11/27/08
to cakep...@googlegroups.com
Pues hay una posibilidad de que ambos objetos session sean distintos, o uno copia del otro... trata usando $_SESSION directamente para descartar que sea eso y no que realmente se pierde la sesión

2008/11/28 Fran Iglesias <fra...@buabua.com>

Fran Iglesias

unread,
Nov 27, 2008, 11:15:53 AM11/27/08
to cakep...@googlegroups.com
Hola,

gracias por la idea.

El 28/11/2008, a las 8:24, José Lorenzo escribió:

> Pues hay una posibilidad de que ambos objetos session sean
> distintos, o uno copia del otro... trata usando $_SESSION
> directamente para descartar que sea eso y no que realmente se pierde
> la sesión


He intentado ver $_SESSION en varios puntos, pero sin resultado
positivo. Es decir, cuando se ejecuta la actualización por Ajax la
sesión ha cambiado.

En el lugar que comentas (cuando le paso el Session Component al
minicontroller) ocurre que Cake ya no recoge los datos porque no hay
nada en la sesión que está activa en ese momento. De hecho $_SESSION
me aparece vacía antes de crear el minicontroller y pasar el Session
Component (y esto funciona perfectamente en una petición normal). Ya
digo, es como si con Ajax se hiciera una sesión nueva y completamente
vacía.

En cambio, si la llamada no es Ajax se recupera la sesión. En el
core.php tengo que no chequee el agente de usuario (que es una causa
señalada en casos similares).

Lo miro con Firebug, pero no llego a ninguna conclusión, pues todo
parece normal. Estoy buscando alguna información de interacción entre
los Session y Cookie component y cosas similares (a veces el orden de
carga importa, no sé). No domino lo suficiente el tema como para saber
dónde debo mirar.

He hecho el experimento de forzar al navegador a preguntar cuando se
intenta guardar una Cookie (la que guarda la sesión Cake, eliminándola
previamente y justo entre el render de la página y antes de que se
solicite la actualización Ajax), pero el caso es que la petición Ajax
no dispara la pregunta, así que no sé cómo hace para acceder a ninguna
sesión.

(Lo peor es que al final va a ser una idiotez que tenga delante de las
narices... mejor será que trabaje en otras partes de la aplicación,
porque llevo media semana sin avanzar nada en ésta.)


--
Fran Iglesias
fra...@buabua.com


Antonio Hern‡andez Sanchez

unread,
Dec 5, 2008, 7:08:42 AM12/5/08
to cakep...@googlegroups.com
Fran Iglesias escribió:

> Gracias.
>
> El 27/11/2008, a las 12:26, Antonio Hern‡ández Sá‡nchez escribió:
>
>
>> Has intentado el tema del beforeFilter? Si es así, y aún tienes
>> problemas, pega el código que estás utilizando, a ver si conseguimos
>> averiguar que pasa.
>>
>
>
> Sí, probé lo de enviar el id de sesión como parámetro, pero sigue
> desaparecida la sesión. De hecho, durante la llamada Ajax se crea una
> sesión nueva (si hago debug($session->read()) en la vista, se ve que
> se han guardado algunas variables, pero aún no he sido capaz de
> determinar todo el proceso). En la navegación estándar se mantiene la
> sesión, o sea que es como si hubiera una sesión distinta para el Ajax.
>

Sin tiempo para mirar tus códigos (voy de trabajo hasta el cuello), sólo
comentarte que yo me encontré un caso rarísimo:

Un ordenador con windows vista, e internet explorer (pero sólo ese
ordenador, a saber qué mierda tendría instalada... aparte de win y
explorer claro)
estaba cacheando las llamadas ajax, de manera que, aunque forzábamos un
id de sesión nuevo cada vez que se accedía a la página con las llamadas,
el muy mamón seguía haciendo las llamadas ajax con un id de sesión anterior.

A ver si puede ser algún problema similar.
--
Antonio

Reply all
Reply to author
Forward
0 new messages