Estoy tratando de controlar cuando un usuario hace logout de mi
aplicaci�n y saber que usuarios hay conectados.
En la Bd hay una tabla de usuarios con un campo que indica si el usuario
est� conectado o no. Cuando un usuario inicia la sesi�n ese campo se
pone a "true", y cuando el usuario pulsa "salir" ese campo se vuelve a
"false".
La complejidad viene cuando un usuario cierra directamente la ventana
del navegador.
Tengo entendido que lo que necesitar�a es detectar dicha acci�n y con
ajax ejecutar una acci�n que cambie el valor de la bd, adem�s de cerrar
la sesi�n.
He probado con esto en el layout:
<script type="text/javascript">
window.onunload = function(){
guardar_info();
}
function guardar_info(){
var url = 'logout/salir';
new Ajax.Request(url, {method: 'post'});
}
</script>
Pero no ejecuta la acci�n.
�Alguien sabe como hacer esto?.
--
Saludos cordiales.
Pablo.
Jose R. Prieto escribi�:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> �Has comprobado que se ejecuta el evento?
>
Si se ejecuta. Si en lugar de llamar a la acci�n le pongo en la funcion
"guardar_info" window.open(url), me abre una ventana con la url que le
indico.
Lo de abrir otra ventana no creo que solucione nada, pues si el usuario
cierra igualmente esa ventana estamos en las mismas.
>
> Si usas Firefox + FireBug, con un console.log te lo deber�a de decir;
> algo as�...
>
>
> <script type="text/javascript">
> window.onunload = function(){
> console.log('Se produce el onunload');
>
> guardar_info();
> }
> function guardar_info(){
> var url = 'logout/salir';
> new Ajax.Request(url, {method: 'post'});
> }
> </script>
>
> No obstante, no se yo si le "dar�s tiempo" a ejecutar la petici�n...
> Yo optar�a, quiz�s, por la opci�n m�s "burda" de ense�arle al usuario
> una ventana de confirmaci�n de que desea salir (si est� autentificado,
> y entiendo que es m�s o menos cr�tico saber cu�ndo se desconecta, no
> le deber�a de "molestar" demasiado...) , y que cu�ndo le de al OK,
> lanzes la petici�n de logout, esperes la devoluci�n del sucess del
> Ajax.Request, y en ese momento cierres la ventana.
>
>
> Otra opci�n, es que, adem�s del campo true / false que comentas,
> utilices otros dos, uno con el session_id, y otro con el momento de la
> �ltima petici�n de ese usuario; con esas dos cosas, podr�s hacer una
> tarea programada cada X tiempo, que vaya "limpiando" de usuarios (en
> apariencia) desconectados -los que su �ltima petici�n haya sido hace
> media hora, una hora.. A tu gusto-, y por otro lado, con el
> session_id, puedes comprobar que sigue en la misma m�quina, o est�
> haciendo una petici�n desde otra -lo cu�l te puede evitar temas de
> secuestro de sesiones, si lo desarrollas un poquito m�s-; recuerda,
> adem�s, que PHP tiene un session_timeout que, si no recuerdo mal,
> estaba establecido por defecto en 20 minutos; al cabo de ese tiempo,
> la session caduca, y el usuario deber�a de tener que volverse a
> identificar -al menos, si no recuerdo mal, con el sfGuardPlugin
> funcionaba, cu�ndo lo hab�a probado.. Aunque ya hace tiempo :)
>
�Como ser�a esto que comentas?.
>
> El tema de la "desconexi�n" sin pasar por el logout, es un tema
> recurrente en las aplicaciones que necesitan un estado.. Y c�mo HTTP
> de momento no nos lo da, pues... Hay que hacer "inventos" :)
>
>
> Otro que se me ocurre ahora mismo, ser�a que, por ejemplo, la
> aplicaci�n vaya haciendo peticiones vac�as v�a Ajax, cada minuto, o
> cada dos minutos, para indicar que la ventana del cliente sigue
> abierta -aunque no haga nada... Por si quieres evitar que se le cierre
> la sesi�n por inactividad-, lo cual, si combinas con lo que te
> comentaba sobre una tarea programada que limpie de "usuarios activos"
> los que lleven m�s de X tiempo sin realizar ninguna petici�n, puede
> ser la soluci�n que buscas... Todo depende de lo que te quieras -o te
> interese- complicarte :)
>
>
> Un saludo y espero haberte sido de ayuda.
>
>
> El 13/01/10 16:28, Pablo Braulio escribi�:
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
>
> iQEcBAEBAgAGBQJLTf73AAoJEFlRSentq+j09OwIALPrwg7IziYASeTdCpYhXnze
> uakKJEFGSz+66LPKPZGXYx8CSb0enAAn36kDa4/BqAUzpLRpwDssLWMQ+LQS2kBs
> N/EZnmadZ7jwfH12Ydv599zcBZrCUOvTFTscQmto7SgP2KN4sp6xY5LjpmtEMAzA
> CRCqFl4fV/ZPTfxZE0P0MDgA0u/gWm2p8uDjhaear8b6rVohTIqRnLTnJ1cMY7V1
> 9NKZP7EDe7WxQF5MZEzz/lPphkSh2FMluLPSn0xifng/ZjaMIciH1mV40bbZQTBg
> K/Wkyky5WEZkI5nHFpAkW6Hh+Wo2V4oVcrqhch2KTmV1G9X3N5wUjSStoDF5JEM=
> =hkwB
> -----END PGP SIGNATURE-----
>
--
Saludos cordiales.
Pablo.
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.
Gracias por los comentarios, pero el evento window.onunload no me sirve,
pues realmente lo que detecta es si se cambia la p�gina o no si se
cierra la ventana del navegador o el navegador.
Pongo el c�digo que me propones en el layout y cada vez que cambio
(pulsando un link o boton, por ejemplo), me muestra el confirm que se ha
programado en el window.onunload.
He visto un evento (o eso creo) window.onclosed, pero no consigo hacerlo
funcionar.
Damian Suarez escribi�:
>
>
> 2010/1/14 Jose R. Prieto <joser....@gmail.com
> <mailto:joser....@gmail.com>>
>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hola de nuevo :)
>
>
> El 13/01/10 19:40, Pablo Braulio escribi�:
> >
> >
> > Jose R. Prieto escribi�:
>
> > �Has comprobado que se ejecuta el evento?
> >
> >
> > > Si se ejecuta. Si en lugar de llamar a la acci�n le pongo en la
> > funcion "guardar_info" window.open(url), me abre una ventana con la
> > url que le indico.
> >
> > > Lo de abrir otra ventana no creo que solucione nada, pues si el
> > usuario cierra igualmente esa ventana estamos en las mismas.
>
>
> No me refer�a a abrir una ventana, sino a poner un alert y/o un
> confirm; algo as� (en una mezcla de javascript y pseudoc�digo, ojo...):
>
> window.onunload =
> function() {
> if (confirm('�Est� Ud. seguro de que desea cerrar la
> aplicaci�n?'))
> {
> // la petici�n y el handler de la respuesta del request
> Ajax va a depender de la librer�a que selecciones
> myAjaxRequest = new Ajax.Request(parametros...)
> myAjaxRequest.on('success', function(){
> // todo correcto, parece; ahora s� cierras la ventana...
> window.close();
> });
> return false
> }
> return false;
> };
>
> Creo recordar que haciendo un return false, no pod�an cerrarte la
> ventana... Vamos, hab�a alguna forma de interceptar el evento, y
> evitar que la cerrasen; m�rate el DOM que aparecer� por ah�
>
> https://developer.mozilla.org/en/DOM/window.onunload
>
>
>
>
> >
> > Si usas Firefox + FireBug, con un console.log te lo deber�a de decir;
> > algo as�...
> >
> >
> > <script type="text/javascript">
> > window.onunload = function(){
> > console.log('Se produce el onunload');
> >
> > guardar_info();
> > }
> > function guardar_info(){
> > var url = 'logout/salir';
> > new Ajax.Request(url, {method: 'post'});
> > }
> > </script>
> >
> > No obstante, no se yo si le "dar�s tiempo" a ejecutar la petici�n...
> > Yo optar�a, quiz�s, por la opci�n m�s "burda" de ense�arle al usuario
> > una ventana de confirmaci�n de que desea salir (si est� autentificado,
> > y entiendo que es m�s o menos cr�tico saber cu�ndo se desconecta, no
> > le deber�a de "molestar" demasiado...) , y que cu�ndo le de al OK,
> > lanzes la petici�n de logout, esperes la devoluci�n del sucess del
> > Ajax.Request, y en ese momento cierres la ventana.
> >
> >
> > Otra opci�n, es que, adem�s del campo true / false que comentas,
> > utilices otros dos, uno con el session_id, y otro con el momento de la
> > �ltima petici�n de ese usuario; con esas dos cosas, podr�s hacer una
> > tarea programada cada X tiempo, que vaya "limpiando" de usuarios (en
> > apariencia) desconectados -los que su �ltima petici�n haya sido hace
> > media hora, una hora.. A tu gusto-, y por otro lado, con el
> > session_id, puedes comprobar que sigue en la misma m�quina, o est�
> > haciendo una petici�n desde otra -lo cu�l te puede evitar temas de
> > secuestro de sesiones, si lo desarrollas un poquito m�s-; recuerda,
> > adem�s, que PHP tiene un session_timeout que, si no recuerdo mal,
> > estaba establecido por defecto en 20 minutos; al cabo de ese tiempo,
> > la session caduca, y el usuario deber�a de tener que volverse a
> > identificar -al menos, si no recuerdo mal, con el sfGuardPlugin
> > funcionaba, cu�ndo lo hab�a probado.. Aunque ya hace tiempo :)
> >
> >
> > > �Como ser�a esto que comentas?.
>
> Lo que te comento aqu�, es b�sicamente, lo siguiente; tienes una
> entidad que es:
>
> Usuario
> campos: id, nombre, pass, activo, ultimo_request, session_id
>
> En cada petici�n que hace el usuario autentificado con la ID
> correspondiente -si est� autentificado, claro-, refrescas el campo
> ultimo_request.
>
> Despu�s, creas una tarea de l�nea de comandos que busque en la tabla
> de usuarios los que est�n activos y que tengan un ultimo_request con
> diferencia de la hora actual mayor del tiempo que tu quieres
> (pongamos, 30 minutos), y lo metes en el cron a ejecutar cada, por
> ejemplo, 30 minutos -o m�s, o menos, ya depende del grado de exactitud
> que prentendas tener-; los que encuentre con esas caracter�sticas,
> pues primero, los desloguea del sistema, y los pone activo a false.
>
> Lo del session_id, es por que, c�mo ya tienes que refrescar un campo
> en la tabla de Usuario, puedes ir refrescando tambi�n el session_id de
> la �ltima petici�n; pero ojo, antes de actualizar ese session_id,
> puedes compararlo con el que tuvieses de antes (si hubo una anterior
> petici�n, el campo session_id tendr� la session_id de esa anterior
> petici�n); si no es el mismo, es que algo hay extra�o.... :)
> L�gicamente, en el momento que activo pasa a false, tienes que poner
> el session_id a vac�o, para que pueda funcionar.
>
> Despu�s, con esto, y haciendo el tema de las peticiones Ajax cada "n"
> minutos, puedes llegar a un nivel de detalle bastante elevado, creo
> yo :)
>
> Espero te sirva :)
>
> PD: para esto, ASP ten�a una cosa muy interesante, que era el
> global.asa (pod�as actuar a nivel de "aplicaci�n" y a nivel de
> "sesi�n" http://www.desarrolloweb.com/articulos/295.php ).. Pena que
> PHP no tenga algo similar (al menos yo no lo conozco) ... ;)
>
>
>
> >
> > El tema de la "desconexi�n" sin pasar por el logout, es un tema
> > recurrente en las aplicaciones que necesitan un estado.. Y c�mo HTTP
> > de momento no nos lo da, pues... Hay que hacer "inventos" :)
> >
> >
> > Otro que se me ocurre ahora mismo, ser�a que, por ejemplo, la
> > aplicaci�n vaya haciendo peticiones vac�as v�a Ajax, cada minuto, o
> > cada dos minutos, para indicar que la ventana del cliente sigue
> > abierta -aunque no haga nada... Por si quieres evitar que se le cierre
> > la sesi�n por inactividad-, lo cual, si combinas con lo que te
> > comentaba sobre una tarea programada que limpie de "usuarios activos"
> > los que lleven m�s de X tiempo sin realizar ninguna petici�n, puede
> > ser la soluci�n que buscas... Todo depende de lo que te quieras -o te
> > interese- complicarte :)
> >
> >
> > Un saludo y espero haberte sido de ayuda.
> >
> >
> > El 13/01/10 16:28, Pablo Braulio escribi�:
> > >>> Hola a todos.
> > >>>
> > >>> Estoy tratando de controlar cuando un usuario hace logout de mi
> > >>> aplicaci�n y saber que usuarios hay conectados.
> > >>>
> > >>> En la Bd hay una tabla de usuarios con un campo que indica si el
> > >>> usuario est� conectado o no. Cuando un usuario inicia la
> sesi�n ese
> > >>> campo se pone a "true", y cuando el usuario pulsa "salir" ese
> campo
> > >>> se vuelve a "false".
> > >>>
> > >>> La complejidad viene cuando un usuario cierra directamente la
> > >>> ventana del navegador.
> > >>>
> > >>> Tengo entendido que lo que necesitar�a es detectar dicha acci�n y
> > >>> con ajax ejecutar una acci�n que cambie el valor de la bd,
> > adem�s de
> > >>> cerrar la sesi�n.
> > >>>
> > >>> He probado con esto en el layout:
> > >>>
> > >>> <script type="text/javascript">
> > >>> window.onunload = function(){
> > >>> guardar_info();
> > >>> }
> > >>> function guardar_info(){
> > >>> var url = 'logout/salir';
> > >>> new Ajax.Request(url, {method: 'post'});
> > >>> }
> > >>> </script>
> > >>>
> > >>> Pero no ejecuta la acci�n.
> > >>>
> > >>> �Alguien sabe como hacer esto?.
> > >
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
>
> iQEcBAEBAgAGBQJLTw0YAAoJEFlRSentq+j0ouIH/RoWKcG65s28/5CNb3/nqk2Q
> 0YiRyYbIdWC/0ofHJ4yb2LEU2LLiUT6AD0QxmLGu6Tit2wTu3Qbfxak4tMl9E8fc
> IyhoHrVYkkIQt++tpu02/VdoLiKZ8w26bJI9gqqkt07OA+6UMb+MsQw2Uop8VzwC
> Qp28ghYmRinnJhX3bPYlo6YIv8RXWOX3m9ZjsfIh055/tCIjE+9/GjO3IDee8z7s
> Biq2bNo5c4boHNOc8IXKltzdqimlL0dRWjnsK1VV9vsLWCy9iZ2pxxWDsBEwayVV
> //7L9DovEjwhAOa2lPJC0+osBsciQMMid4fUJoyzOrC2qvUvNN8oba8+83N7pEc=
> =q3lq
> -----END PGP SIGNATURE-----
>
>
> --
> Has recibido este mensaje porque est�s suscrito al grupo
> "symfony-es" de Grupos de Google.
> Para publicar una entrada en este grupo, env�a un correo electr�nico
> a symfo...@googlegroups.com <mailto:symfo...@googlegroups.com>.
> Para anular tu suscripci�n a este grupo, env�a un correo electr�nico
> a symfony-es+...@googlegroups.com
> <mailto:symfony-es%2Bunsu...@googlegroups.com>
> Para tener acceso a m�s opciones, visita el grupo en
> http://groups.google.com/group/symfony-es?hl=es.
>
>
> No tiene sentido hacer tanta complejidad para tu tarea. Tienes que
> enfocarte en lo primero que has preguntado. La tecnolog�a que usas (JS y
> PHP) permiten hacerlo sin problemas; lo que sucede es que hay que
> investigar un poco.
>
> Yo lo pienso de esta manera. Volviendo a tu primer script:
>
> 1) Evitar que se cierre la venatan
> Busca la forma de hacerlo. Puedes interceptar el evento. Busca
>
> 2) Haz la conexi�n con AJAX y env�ala
>
> 3) Espera el resultado OK de la respuesta. EL objeto request tiene
> varios estados. Creo que el 4 es que la respuesta ha llegado correctamente.
>
> 4) Cuando tengas el resultado, ahora si cierra la ventana.
>
> Haciendo esos pasos debe funcionar.
> Saludos.
>
> --
> www.cabezaderaton.com.ar <http://www.cabezaderaton.com.ar> |
> www.symfonias.com.ar <http://www.symfonias.com.ar>
>
> ------------------------------------------------------------------------
>
> --
> Has recibido este mensaje porque est�s suscrito al grupo "symfony-es" de
> Grupos de Google.
> Para publicar una entrada en este grupo, env�a un correo electr�nico a
> symfo...@googlegroups.com.
> Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a
> symfony-es+...@googlegroups.com
> Para tener acceso a m�s opciones, visita el grupo en
> http://groups.google.com/group/symfony-es?hl=es.
--
Saludos cordiales.
Pablo.