Manejo de sesiones

Alguine me puede ayudar, estoy haciendo un sistema que sólo permite a un usuario logearse una vez, esto lo hago creando un arreglo estatico y agregando los usuarios en él de tal manera que si ya estan en el arreglo no les permito conectarse otra vez, cuando el usuario cierra sesion desde la opcion cerrar sesion lo elimino del arreglo, si cierra el navegador lo elimino con un javascript que hace lo mismo que el boton cerrar sesion, sin embargo algunas ocasiones el usuario no se elimina de mi arreglo. Existe alguna forma de obtener las sesiones vivas en el servidor? esto para saber si la sesion asociada al usuario ya no existe para eliminarlo del arreglo

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Mapa

Tal vez sea mejor que uses un mapa en vez de un arreglo. Tu algoritmo sería algo así:

  1. Revisar si el usuario está en el mapa
  2. Si no está, le permites la entrada, y en el mapa pones su login como llave y la fecha de ingreso como valor.
  3. Si ya está en el mapa, revisas la fecha que tiene el mapa para este usuario; si es mayor a la duración de una sesión, le permites la entrada y actualizas la fecha de ingreso
  4. Si ya está en el mapa pero la fecha registrada ahí es muy reciente (menos de lo que dura una sesión), le rechazas el acceso diciéndole que tiene una sesión activa y tiene que esperar X tiempo a que expire
  5. Cada vez que el usuario tiene una interacción con tu aplicación, debes actualizar ese mapa

El problema tal vez lo tienes porque pues si un usuario deshabilita javascript, no se quita nunca de la lista. O si su navegador truena o su computadora se congela, etc el javascript no se ejecuta y cuando quiera volver a entrar no podrá porque sigue en la lista. El manejo del mapa te permite ver la fecha en que entró para ver si es muy reciente o si ya pasó un buen rato, pero vas a tener que actualizar para ver su última interacción y comparar el tiempo transcurrido con el timeout de sesión para decidir si lo dejas entrar.

Lo mejor sería que el contenedor invocara un código tuyo al expirar una sesión, para asegurar que se quita el usuario de la sesión (adicional a los mecanismos que ya tienes) pero la verdad no sé si se pueda definir un "hook" de ese tipo (de manera estándar; tal vez algunos contenedores lo soporten y otros no).

Lo mejor sería que el

Lo mejor sería que el contenedor invocara un código tuyo al expirar una sesión, para asegurar que se quita el usuario de la sesión (adicional a los mecanismos que ya tienes) pero la verdad no sé si se pueda definir un "hook" de ese tipo (de manera estándar; tal vez algunos contenedores lo soporten y otros no).

Con un javax.servlet.http.HttpSessionListener es posible implementar dicho "hook" de manera estándar.

Si joelgoes está usando WebLogic o WebSphere, antes de reinventar el hilo negro: es muy probable que la funcionalidad que él requiere ya venga implementada por los respectivos frameworks de seguridad de dichos servidores.

Saludos

Javier

mmm

No tengo mucha experiencia en servlets (apenas empieso) pero...
Tal vez puedas crear un hilo he iniciarlo en el init (para que se cargue una sola vez y no cuando se use el servlet) con el hilo le pasas el arreglo y lo puedes validar cada cierto tiempo.
Si haces esto usa una matriz donde colocas la hora de inicio de sesion obtenida del lado del servidor y asi si se vee cierto tiempo de inactividad lo elimina

Pero creo q esto es algo de "basura"....(Usando beans lo haria asi) Si no estoy mal ud puede validar los cierres de sesion por medio del archivo web.xml y
asi al iniciar sesion desde otra terminal con el mismo usuario ud puede hacer que el registro de inicio de sesion se haga desde el applicationbean que es de uso global de la aplicacion y asi no se crean nuevas instancias de las clases (servlets) y los objetos persisten y se pueden ver.

Re: mmm

Emanuel,

Buena participación, sin embargo le recomendaría familiarizarse con el API/Framework de Servlet. Sus supuestos son erróneos:

1. El modelo J2EE está en contra de la creación de hilos por parte del desarrollador.
2. No reinvente la rueda, la funcionalidad de verificar el tiempo de una sesión *ya* está implementado por el contenedor de servlets.
3. En el archivo web.xml no se validan los cierres de sesión, sólo se configura el "timeout" de las sesiones tras un tiempo de inactividad.
4. Siempre se crean automáticamente instancias de servlets. Tire a la basura el libro que le habla del modelo de un solo thread. Eso ya está descontinuado y lo va a desorientar.

Saludos cordiales

Javier Castañón