2010-04-24 20 views
5

Estoy implementando una aplicación web, que usa sesiones. Estoy usando GWT y el motor de aplicaciones como mi cliente/servidor, pero no creo que estén haciendo algo realmente diferente de lo que haría con PHP y Apache, etc.¿Cuánto duran las cookies de sesión?

Cuando un usuario inicia sesión en mi aplicación web, Estoy usando HttpSession para comenzar una sesión para ellos. Me da la ID de sesión como esto:

// From my login servlet: 
getThreadLocalRequest().getSession(false).getId(); 

Puedo devolver el sessionId de vuelta al cliente, y la almacenan en una cookie. El tutorial estoy usando conjuntos de esta cookie para 'expirar' en dos semanas:

Cookie.write("sid", theSessionId, 1000 * 60 * 60 * 24 * 14); // two weeks 

Aquí es donde estoy confundido: si la cookie expira en dos semanas, entonces mi usuario ir junto con el webapp felizmente, solo para un día navegar a mi sitio y mostrar una pantalla de inicio de sesión. ¿Cuáles son mis opciones? ¿Puedo simplemente no establecer un tiempo de caducidad para esta cookie? De esa forma, el usuario tendría que cerrar sesión de forma explícita, de lo contrario, podrían usar la aplicación para siempre sin tener que volver a iniciar sesión.

¿O hay una manera mejor de hacer esto? No recuerdo que sitios como Twitter me hayan pedido que vuelva a iniciar sesión. Parece que estoy conectado permanentemente. ¿Simplemente no establecen la caducidad?

La aplicación web no protege ningún tipo de datos altamente confidenciales, así que no me importa dejar una cookie que no caduque, pero parece que debe haber una forma mejor.

Este es el tutorial que estoy haciendo referencia:

http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ

Gracias

+1

Normalmente, muchas aplicaciones web que he visto permiten marcar "mantenerme conectado", lo que le permite iniciar sesión indefinidamente o si no está habilitado, cierre la sesión después de cerrar el navegador. – Corey

Respuesta

3

El HttpSession está detrás de las escenas ya respaldados por una cookie. Verifique la lista de cookies del navegador para el que tiene el nombre jsessionid. Además, al obtener una instancia, debe llamar al getSession() sin false, de lo contrario, puede arriesgarse a NullPointerException cuando aún no se haya creado y, por lo tanto, devolverá null.

Cuando inicia sesión, por lo general pone el usuario registrado en User en la sesión.

User user = userDAO.find(username, password); 
if (user != null) { 
    session.setAttribute("user", user); 
} else { 
    // Handle error "Unknown username/password combo." 
} 

Usted puede dejar que su aplicación web en la intercepción conectado User con sólo comprobar su presencia en la sesión. Por ejemplo, en un Filter que le gustaría usar para bloquear páginas seguras.

if (session.getAttribute("user") == null) { 
    response.sendRedirect("login"); 
} else { 
    chain.doFilter(request, response); 
} 

El HttpSession tiene en la mayoría de webcontainers un tiempo de espera predeterminado de 30 minutos. En otras palabras, expirará 30 minutos después de la última solicitud. Esto es configurable en web.xml como sigue:

<session-config> 
    <session-timeout>10</session-timeout> 
</session-config> 

Cuando el tiempo de espera es en minutos (por lo tanto 10 minutos en el ejemplo anterior).

Si desea proporcionar una opción de "Recordarme en este equipo" (automática), entonces usted tiene que crear otra galleta con otro identificador.Anteriormente publiqué una respuesta detallada sobre eso: Java - How do I keep a user logged into my site for months?

+0

¿Ok, entonces realmente no necesito hacer nada del lado del cliente para apoyar esto? Probé en el motor de la aplicación y funciona, pero la sesión no se retiene después de que cierro el navegador, incluso si pongo una duración explícita de tiempo de espera de la sesión en web.xml. Supongo que no importa, porque la segunda parte "mantener a un usuario conectado a mi sitio durante meses" debería cubrirlo? Gracias – user246114

+0

Eso es correcto. Cuando apaga el navegador web, todas las cookies sin una edad serán guardadas. Debe proporcionar su propia cookie siempre que desee mantenerla un poco más persistente. – BalusC

+1

Ok, eso tiene sentido, pero luego estoy confundido sobre cómo puedes hacer un inicio de sesión automágico inmediato como en tu otra pregunta de respuesta. Cuando el usuario reinicia su navegador, jsessionid se purga. Por lo tanto, en el siguiente reinicio, el navegador irá a www.misitio.com y * no * verá que tiene jsessionid. Por lo tanto, el servidor publicará la página como si el usuario * no * estuviera autenticado. Requerirá que el cliente haga un viaje de regreso al servidor ahora para decirle que el usuario de hecho está autenticado. ¿No hay forma de que el navegador envíe mi propia cookie en la primera presentación? Elaboraremos en edición original de Q, ¡gracias! – user246114

Cuestiones relacionadas