Problema: Sesiones mezcladas cuando se conectan muchos usuarios.

Buen Día!.
Tengo el siguiente problema: Un sistema que ya se encuentra en producción empezó a fallar ya que cuando se conectan muchos usuarios, las sesiones se empiezan a mezclar; por ejemplo: El usuario Javier inicia sesión capturando su usuario y contraseña; cuando el usuario entra al sistema aparece otra persona como logueada, digamos que aparece Daniela en lugar de Javier que es el que inicio sesión.
Considero que es un grave problema ya que los usuario pueden ver la información de los demás, por eso recurro aquí para saber si alguien tiene alguna sugerencia.

La aplicación esta desarrollada en Java y montada sobre un servidor en tomcat 6.
La manera en que se están guardando los datos de la sesión es:

        HttpSession sSesion=req.getSession();
       sSesion.setAttribute(sNombre, oObjeto);

oObjeto es el objeto donde viene la información del usuario al momento de verificar su nombre de usuario y contraseña.
De antemano gracias!.

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.

Problemas de estados

Eso pasa seguido y es la razón de porqué muchos frameworks o librerías prefieren manejar métodos stateless. Mi recomendación es que guardes el estado en el lado del cliente, puede ser con cookies o utilizando caché. Claro que desde ahí hay que estar muy pendiente de que no se roben las cookies y demás cuentos o incluso pudieras enviar cookies firmadas y cifradas.

Pero si eres de los que están a favor de la tecnología stateful, creo que debes revisar bien como funciona la clase HttpSession (que creo si mi memoria no me falla, es una interfaz y no una clase). Aquí tienes un ejemplo de como extraer una sesión es específico y como asignarle valores.

Espero y que con ese ejemplo o propuesta se solucionen tus problemas.

Problema con sesiones

Lo primero que yo haria es no crear un objeto del tipo HttpSession utilizaria el que ya existe por default de nombre session y ya sobre este
utilizar los metodos para almacenar y extrar los atributos de las sesion session.getAttribute("ValorX") y session.setAttribute("ValorX","5")
Probablemente cuando creas la instancia del objeto sSesion lo haces de forma global y se comparte en objeto con todos los usuarios a mi me pasaba eso pero con variables de tipo de dato primitivo.

Sesiones mezcladas

Muchas Gracias a ambos por su ayuda, ahorita tratare de implementar sus sugerencias.

Imagen de rojovizcaino

El problema no es el objeto

El problema no es el objeto de sesión sino como y cuando escribes en el. Debes asegurarte que tus servlets son thread-safe o en su defecto se esta utilizando en SingleThreadModel. Por supuesto, si dentro de tu servlet utilizas alguna utilería, por ejemplo algún objeto en el "scope" de aplicación, o algún "singleton" puedes tener problemas de concurrencia como el que reportas.

Imagen de neko069

Los servlets son thread safe

Los servlets son thread safe por defecto.
De lo que te tienes que asegurar es:
- Que no existan variables globales, a menos que sean constantes para TODOS los casos, todas tus variables deben ser locales.
- Ningún método debe tener la marca de Synchronized.
- Si por alguna razón ( realmente obligatoria/extraordinaria ) debes recurrir a la sincronización ( y sinceramente, no se me ocurre algún escenario de ése ámbito ), entonces mejor le quitas la marca de Synchronized a tus métodos e implementas en tu servlet la interface SingleThreadModel, peeeeeero, tienes que checar performance, a ver si no se alenta tu aplicación, por el uso de ésa interface.

Imagen de ezamudio

thread safe? no

Que sean thread safe o no, depende del programador. Y en este caso parece que no lo es.

Sólo que te refieras a tener un servlet vacío, es decir que implementas doGet y/o doPost pero no tienen còdigo. En ese caso pues sí, son stateless y por tanto thread safe.

En Java no existen variables globales. pero en servlets hay que evitar meterle estado a la clase, o sea no meter ningun valor de una peticion, respuesta o sesiòn en variables de instancia. puefes tener variables de instancia pero que sean refs a otros componentes stateless.

Por lo demas,son buenas recomendaciones. Evitar synchronized, etc.

Estuve revisando el sistema y

Estuve revisando el sistema y no encontré ningún método synchronized, voy a checar las demás sugerencias y Gracias a todos por su ayuda de nueva cuenta!.