Hace unos días, cuando trabajaba en un sistema de registro, encontré un problema de sesión popular. El proyecto es Spring+SpringMVC+MyBatis Framework, el sistema del directorio de gestión Maven del lado de Javaweb. Para algunos problemas de sesión, se realiza el siguiente análisis. Aquí, nos centramos en el tema del ciclo de vida de la sesión. En cuanto a otras definiciones, no explicaremos:
Primero, explicemos el ciclo de vida de la sesión:
Almacenamiento: la sesión se almacena en el lado del servidor. En general, para evitar que se almacene en la memoria del servidor (para acceso de alta velocidad), Sessinon se crea cuando el usuario accede al servidor por primera vez. Es necesario tener en cuenta que la sesión se creará solo al acceder a JSP, Servlet y otros programas. Solo acceder a recursos estáticos como HTML e Image no creará una sesión. En una aplicación de Javaweb, puede llamar a Solicitar. GetSession (Boolean XXX) para generar una sesión. Tenga en cuenta que cuando el parámetro booleano es verdadero, una nueva sesión se ve obligada a generarse aquí.
1. Tiempo de vencimiento de la sesión:
La sesión expira después de la última vez que se usó la sesión alcanzó el tiempo de falla establecido.
2. Otro método session.invalidate () se ejecuta, lo que hace que la sesión sea inválida.
Para el tiempo de invalidación, puede definirlo configurando propiedades en Web.xml:
<Session-Config> <Sexy Timeout> Tiempo de vencimiento </Tiempo de sesión> </session-Config>
La unidad de tiempo de falla es de minutos. Si la sesión es válida por un día, se puede configurar en 60*24. Cuando se establece en 0 o negativo, la sesión es permanentemente válida. Según la definición del tiempo de falla, es fácil entender esta situación.
¿Por qué fallan la sesión después de que el navegador está cerrado?
Basado en lo que se sabe, se escribió un ejemplo simple:
@ControllerPublic de clase SessionTest {@RequestMapping ("/SessionTest") Public String SessionTest (httpservletRequest solicitud, respuesta httpServletResponse) {system.out.println ("éxito!"); Httpsession session = request.getSession (); session.SetMaxInActiveInterval (259200); request.setAttribute ("creationtime", session.getCreationTime ()); // creación tiempo request.setAttribute ("id", session.getId ()); // id request.setAttribute ("max", session.getMaxInactiveInterval (-1); // tiempo de falla máxima // aquí, la prioridad de maxinActiveS es superior a la sesión de la sesión. la unidad es la segunda request.setAttribute ("LastTime", session.getLastacceSttime ()); // Último tiempo de uso request.setAttribute ("sessionTest", session); // system.println (session.getCreationTime ()); // system.println (session.getmaxinactiveVal (); /// System.out.println (session.getLastacceSttime ()); regresar "página/showsession"; } <Tabla CellPacing = "0" CellPadding = "0"> <tr> <td> Tiempo de creación: </td> <td> $ {creationtime} </td> </tr> <tr> <tr> <td> id: </td> <td> $ {id} </td> </tr> <tr> <td> maximum Survival Survival Tiempo: </td> <td> $ {max} </td> </tr> <tr> <td> la última vez que usa: </td> <td> $ {lasttime} </td> </tr> <tr> <tr> <td> sesión: </td> <td> $ {sessiontest} </td> </tr> </play>Análisis:
Se puede ver que el tiempo de invalidación de la sesión es en realidad cuando el navegador está cerrado, por lo que solo si el navegador no cierra y accede nuevamente, ¿puede continuar usando el estado de inicio de sesión? ¿Qué representa el tiempo de invalidación que establecemos anteriormente?
Se creó una sesión entre el navegador y el servidor. Dado que el cliente no interactuó con el servidor durante mucho tiempo (tiempo de hibernación), el servidor destruyó esta sesión. La sesión anterior cuando el cliente interactuó con el servidor nuevamente no existía. Entiendo que el tiempo de invalidación solo entra en vigencia durante una sesión. Si el navegador está cerrado y la sesión finaliza, el tiempo de invalidación se establece en permanentemente válido, que es el momento en que el navegador está cerrado y la sesión está cerrada. Para resolver este problema, puede mezclar cookies con sesiones. Hay una manera tan estúpida:
Agregue activamente cookies para establecer el directorio de guardado y el tiempo de supervivencia
public static void addcookie (nombre de cadena, valor de cadena, int Age, httpservletResponse Respuesta) lanza UnspportedEncodingException {cookie c = new Cookie (nombre, urlencoder.encode (valor, "utf-8")); c.setMaxage (edad); C.SetPath (ruta); Respuesta.AddCookie (C); } Al acceder nuevamente, use Cookie[] cookies = request.getCookies(); Para atravesar las cookies, obtenga la cookie deseada de acuerdo con el nombre de la cookie, o se puede decir que es una sesión. Finalmente, obtienes el resultado deseado, y la sesión (la cookie llamada JSesionID) escapa del encarcelamiento del navegador.
Resumir
Lo anterior es la solución al problema de la falla de sesión J2EE después de que se cierra el navegador. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!