2012-01-08 9 views
5

Tengo una aplicación GWT que tiene el servicio RPC en su parte posterior. Actualmente estoy tratando de implementar el soporte de los usuarios y la única pregunta que aún queda es la forma en que debo almacenar los datos de la sesión.Trabajar con sesiones en la aplicación GWT

Estoy almacenando identificador de sesión utilizando

getThreadLocalRequest().getSession().setAttribute("sid", "randomSIDgoeshere"); 

Así, la primera pregunta es más para servlets Java que a GWT. ¿Esta garantía de código que la próxima vez que haga una llamada como ésta:

getThreadLocalRequest().getSession().getAttribute("sid"); 

Sería bien ser nulo (en caso de que se llama para el usuario que aún no ha visitado el pedazo de código en la que se establece el atributo SID) o sería exactamente el mismo SID que ya guardé para ese usuario. En otras palabras, ¿son estas 2 piezas de código específicas para el usuario? (Por usuario Me refiero a un solo navegador en una sola computadora)

La segunda pregunta es sobre el almacenamiento de las asignaciones entre los SID y algunos datos adicionales, como la identificación del usuario. En caso de que tenga un código como este:

public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService { 
    // SID to User ID mappings 
    private final Map<String, String> sessions = 
    new HashMap<String, String>(); 
    ... 
} 

Es garantizado que sessions es siempre el mismo objeto para todas las solicitudes y los datos que se mantendrá "viva" a menos que se termina toda la aplicación? (Tomcat se detiene, por ejemplo) ¿Es un enfoque normal o debería persistir todas estas asignaciones en mi base de datos?

Respuesta

7

Primero:

Sí, lo garantiza. La próxima vez que llame al getThreadLocalRequest().getSession().getAttribute("sid"); en la siguiente solicitud, el atributo sid permanecerá allí. Pero recuerde, ese es el área de solicitud local, por lo tanto, solo las solicitudes del mismo usuario (navegador + ip) compartirán la información. Eso significa:

Hecho:

  • usuario A se conecta con Firefox
  • almacena un valor aleatorio X con el ID Y

Caso conecta 1

  • usuario una con Firefox
  • Puede recuperar el X

Caso 2

  • usuario A se conecta con Google Chrome
  • No se puede recuperar el X

Caso valor de 3

  • usuario B se conecta con Firefox
  • No puedes recuperar cree el valor X

Así que sí, el contenido de la sesión es específico del usuario. Lo que existe en una sesión no implica que existirá en otra sesión.

Segundo:

No, no se garantiza. Aunque la mayoría de las veces se llamará al mismo servicio de servicio, no se garantiza que siempre exista. Si desea conservar los atributos en su servelet, debe declarar esos atributos como Estático, y de esa manera, ESE atributo estático no será específico del usuario. O puede almacenar en el ServeletContext

Lo digo porque las diferentes implementaciones (como Glassfish) pueden terminar instancias si el servelet no se requiere durante un largo período de tiempo (por lo que recuerdo, no estoy seguro de esto (Glassfish terminando la instancia)). Pero no hay documentación que indique que garantiza que será la misma instancia, por lo que no puede declarar atributos no estáticos y compartir entre distintas instancias.

+0

Gracias, realmente una gran respuesta! – agibalov

Cuestiones relacionadas