Recientemente, estaba escribiendo un sitio web de compra de libros. Al probar la función de cierre de sesión, haciendo clic en el navegador para volver a actualizar el navegador, encontrará que el usuario que ya ha desconectado ha iniciado sesión nuevamente.
Después de pensar durante mucho tiempo, he encontrado muchas soluciones en línea, pero la mayoría de los métodos dados en línea son usar JS para cerrar la sesión y prohibir a los usuarios hacer clic en el navegador para devolver.
Aunque este método es factible, realmente no resuelve este problema en segundo plano. Se siente como protegerse contra los caballeros pero no los villanos.
El siguiente es el método que implementó
principio:
Después de iniciar sesión, haga clic en el navegador para volver a actualizar el navegador. De hecho, el navegador reúne la información del formulario original.
Iniciar sesión significa matar la sesión original
// Soge de sesión privado void (httpservletRequest solicitud, respuesta httpservletResponse) lanza ServletException, ioexception {httpsession session = request.getSession (); request.setAttribute ("sessionId", session.getId ()); session.removeAttribute ("usuario"); session.Invalidate (); respuesta.sendedirect (request.getContextPath () + "/index.jsp"); } Al redirigir a una página JSP después de la sesión, la sesión generada es diferente de la sesión original (la sesión de la página JSP está habilitada de forma predeterminada)
Es decir, después de cerrar la sesión, hacer clic en el navegador para volver a actualizar la sesión es una nueva sesión. Desde esta perspectiva, piense en la solución.
Puse un dato en la sesión original. Puedo obtener estos datos por primera vez cuando inicié sesión. Después de cerrar la sesión, la sesión original se ha ido. Haga clic en el navegador para volver a actualizar. No hay datos en la nueva sesión. El valor obtenido es nulo
Haga coincidir los datos en la sesión original con el nuevo valor de la sesión. Uno tiene un valor y el otro es nulo. La coincidencia definitivamente fallará. En este momento, puede dar un mensaje fácil de usar y dejar que el usuario inicie sesión nuevamente.
Entonces, ¿cómo se pueden guardar los datos en la sesión original después de cerrar la sesión (si se cancela la sesión original, desaparecerá)? Considere agregar un dominio oculto al formulario y coloque los datos en la sesión original en el dominio oculto. Después de cerrar la sesión, haga clic en el navegador para volver a actualizar. El navegador enviará automáticamente los datos en la sesión original sin guardarlos usted mismo (de hecho, el ahorro manual puede tener que colocarse en el contexto de la aplicación ServletContext, y nunca lo he probado)
Un poco similar a una solución a las presentaciones repetidas de formularios, pero los datos en la sesión original no se pueden eliminar aquí, porque la misma sesión no es la misma sesión antes y después del cierre de sesión.
Los detalles son los siguientes: en login.jsp
<%String token = new Random (). NextLong ()+""; session.setTribute ("token", token);%> <form de acción = "$ {pageContext.request.contextPath}/servlet/servlet? type = "text" name = "name"> </td> </tr> <tr> <tr> <td align = "right"> contraseña: </td> <td> <input type = "contraseña" name = "contraseña"> </td> </tr> <tr> type = "Hidden" name = "token" value = "$ {sessionsCope.Token}"> </form> En el servlet, otorgue un aviso amistoso y redirige a la página de inicio de sesión
Httpsession session = request.getSession (); // Resuelve el problema del inicio de sesión repetido del navegador después de cerrar la sesión // dar un campo de entrada oculto y obtener el valor del dominio oculto en el fondo // Actualizar el navegador después de cerrar la sesión de la sesión generará una nueva sesión, de modo que la sesión de sesión se obtenga como NULL // SO HIDDENTOKEDS (SessionToken) debe ser falso String SessionToken. Cadena Hiddentoken = request.getParameter ("token"); if (! hiddentoken.equals (sessionToken)) {request.setTtribute ("Mensaje", "Ha desconectado, inicie sesión nuevamente y gire a la página de inicio de sesión después de 2 segundos <meta http-oquiv = 'refresh' content = 2; url =" + request.getContextPath () + "/client/login.jsp>); request.getRequestDIsPatcher ("/Client/Message.jsp"). Foring (Solicitar, respuesta); devolver; } prueba:
Acceso
Después de iniciar sesión, haga clic en el navegador para volver a actualizar. El navegador solicitará si reenviar los datos.
Haga clic para reenviar
Esto resuelve el problema de hacer clic en el navegador para volver a actualizar al usuario e iniciar sesión nuevamente después de cerrar la sesión.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.