Spring security cruce de datos de sesiones.

Hola. Espero que alguien pueda ayudarme.
Tengo un problema que no he logrado resolver respecto
del manejo de sesiones en una aplicacion web que he desarrollado.

Entorno: oc4j, spring MVC + hibernate

El problema es el siguiente: Cuando un usuario se logea en el sitio,
se recuperan de la BD los datos del usuario y los almaceno en una nueva sesion.

Hasta aquí no debería haber problema para que todo funcione OK, el
problema es que, en computadores distintos, con browsers distintos
, casi siempre al usuario que se loguea, le muestra los datos
del usuario que se logeo anteriormente, es como si quedara sucia la
jsp, ya que al hacer refresh del browser muestra los datos correctos.
No es caché de browser, ya que son usuarios distintos en computadores
distintos.
Al imprimir en el log los datos devueltos de la base de datos, veo
que son los que corresponden, es decir, los del usuario actual, pero
se imprimen en la web los del usuario anterior.

¿Cómo es posible que se estén confundiendo las sesiones??

Espero alguien me pueda ayudar, no veo cómo arreglarlo.

Gracias de antemano,

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

dónde copias los datos

Suena como que copiaste los datos del usuario a una variable que no es de sesión, para presentarlos en el jsp. El primer usuario obtiene sus datos y se muestran bien; el segundo usuario obtiene sus datos, pero por alguna razón ya no se copian al jsp porque ya están los del primer usuario, y entonces se muestran los del primer usuario (aunque hayas obtenido los del segundo usuario y en logs veas que sí cada usuario tiene sus propios datos, porque el código para generar ese log sí lee los datos de donde debe leerlos, pero el que los presenta no los lee de la sesión sino de algún otro lugar donde se copiaron la primera vez pero no la segunda).

Gracias, Cuando un usuario

Gracias, Cuando un usuario entra en la aplicación, se comprueba en BD si es correcto. Una vez se ha verificado se añade una variable en session con datos del usuario.

Aleatoriamente, entra otro usuario desde otro equipo y cuando esta trabajando y necesita recuperar la variable de session con sus datos, recupera datos de otro usuario que está en la aplicación.

Como te digo, no ocurre siempre, es de forma aleatoria.

Imagen de ezamudio

es lo mismo

La cosa es que seguramente en el JSP o en algún servlet estás guardando estado (o sea, tienes una variable de instancia donde guardas datos del usuario) y por eso se "baten" los datos y un usuario ve los de otro.

Los datos de sesión deben ir almacenados en la sesión, jamás en una variable de instancia. Los jsp's y servlets deben ser completamente stateless, no deben usar variables de instancia para guardar datos que deben estar en la sesión.

Ejemplo:

public class MiServlet {
  private DAO dao; //eso esta bien, siempre y cuando tambien sea stateless el DAO
  private String nombre; //Esto es lo que puede causar problemas

  public void doPost(blabla) {
    nombre = //tomar el nombre de la petición HTTP o de la sesión
    otroMetodo();
  }

  protected void otroMetodo() {
    //hacemos algo con el nombre
  }
}

Lo anterior está mal porque solamente va a existir una instancia del servlet, por lo tanto si dos usuarios entran al mismo tiempo, el método doPost se va a ejecutar en dos hilos distintos y entonces puede que la instrucción de doPost se ejecuta en el hilo 1 e inmediatamente después en el hilo 2, y luego cuando se ejecuta otroMetodo en el hilo 1, la variable nombre ya tiene el valor asignado en el hilo 2.

Lo que debes hacer es pasar todos esos valores como parámetros para no guardar estado en el componente:

public class MiServlet {
  private DAO dao; //eso esta bien, siempre y cuando tambien sea stateless el DAO

  public void doPost(blabla) {
    String nombre = //tomar el nombre de la petición HTTP o de la sesión
    otroMetodo(nombre);
  }

  protected void otroMetodo(String nombre) {
    //hacemos algo con el nombre
  }
}

Con esta nueva versión, cada hilo va a ejecutar el mismo código de la misma instancia del servlet pero no se batirán los datos porque los parámetros que llegan al doPost son distintos en cada caso y no se guarda nada de ahí en las variables del objeto.

Imagen de Shadonwk

no creo que sea de forma

no creo que sea de forma aleatoria, mas bien pienso que puede ser alguna variable de aplicación estas se inicializan con el primer usuario y como son de aplicación siguen viviendo cuando un segundo usuario entra, como dice ezamudio los log estan bien porque imprime lo que te recupera de la BD pero la jsp no reasigna el valor puesto que ya los tiene, cuando es aleatorio seguramente se reinicia tu servidor y las variables no estan inicializadas por ello esta vez lo hace bien, porque no lees mas hacerca de los scopes de los beans.