2011-06-23 14 views
6

Tengo una implementación de HttpSessionListener donde se liberan recursos 'bloqueados' en la aplicación con el método sessionDestroyed.HttpSessionListener - ¿Se invocará el método sessionDestroyed en el tiempo de espera de la sesión?

La información de "bloqueo" se mantiene en la base de datos, y la liberación de bloqueos funciona bien en la mayoría de los casos. Pero en algunos casos todavía veo recursos bloqueados, ¡incluso si no hay sesión activa!

Entonces, estoy dudando si hay posibilidad de que sessionDestroyed no se invoque? Supongamos que si se agota el tiempo de espera de la sesión, ¿se llamará al método sessionDestroyed?

Supongamos que el usuario cierra la pestaña del navegador sin cerrar la sesión (destruyendo la sesión) -entonces ¿se invocará al oyente?

¡Gracias de antemano!

Respuesta

2

Un motor de servlet manejará los tiempos de espera de la sesión. Se determinará solo cuando la sesión ya no sea válida y se llamará al sessionDestroyed. (Esto puede ocurrir un tiempo después de que el usuario cerró su navegador).

Algunos otros puntos:

de registro

Tal vez se puede añadir un poco de la tala a métodos sessionCreated y sessionDestroyed. para cada sesión creada, debes tener una sesión destruida.

excepion Manejo

Tal vez el hecho de que la materia permanece bloqueada no se debe a la sesión no sean destruidos, pero tal vez debido a un error en la lógica sessionDestroyed. ¿Tiene suficiente manejo/registro de excepciones en su lugar allí?

sincronización

¿Ha esperado el tiempo suficiente para revisar sus recursos bloqueados? (cierre todos los clientes y tenga en cuenta el valor de tiempo de espera de la sesión configurado en la aplicación/servidor). Como se indicó anteriormente, el servidor no puede detectar a un usuario que cierra un navegador, pero sí mantiene su lista de sesiones http, y los destruirá después de que se agote el tiempo de espera.

+0

Gracias ddewaele! El manejo de excepciones fue el truco. No había captado una excepción de base de datos. Probará la aplicación una vez que se maneje la excepción y verificará los resultados. – Ajay

1

Entonces, estoy dudando si hay posibilidad de que la sesiónDestroyed no se invoque? Supongamos que si se agota el tiempo de espera de la sesión, ¿se llamará al método sessionDestroyed?

Sí. Una sesión se destruye cuando se agota el tiempo o alguien la expira programáticamente (a través del HttpSession.invalidate()).

Supongamos que el usuario cierra la pestaña del navegador sin cerrar la sesión (destruyendo la sesión) -entonces ¿se invocará al oyente?

No, porque la sesión sigue siendo válida. Si dicho usuario vuelve a abrir el sitio web, su sesión seguirá siendo válida.

Desde el HttpSessionjavadoc:

Las notificaciones se envían después de que los métodos de encuadernación completos. Para las sesiones que se invalidan o caducan, las notificaciones se envían después de que la sesión se haya invalidado o haya caducado.

Cuestiones relacionadas