English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Método para resolver el problema de que el usuario se desloguea en javaweb y luego hace clic en el botón Atrás del navegador para recargar la página y volver a conectarse

Recientemente, mientras escribía un sitio web de compra, al probar la función de cerrar sesión y hacer clic en el retorno del navegador y actualizar, me di cuenta de que el usuario que ya había cerrado sesión volvió a iniciar sesión 

He pensado mucho y he encontrado muchos métodos en línea, sin embargo, la mayoría de los métodos dados en línea son implementados con js para prohibir al usuario hacer clic en el retorno del navegador después de cerrar sesión 

Este método es factible, pero no resuelve realmente el problema en el backend, tiene una sensación de evitar a los honrados pero no a los deshonestos 

A continuación, registro el método que he implementado 

Principio: 

Después de cerrar sesión, hacer clic en el retorno del navegador y actualizar el navegador es en realidad que el navegador envía nuevamente la información del formulario original 

注销 es eliminar el session original

// 注销
 private void logout(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  HttpSession session = request.getSession();
  request.setAttribute("sessionId", session.getId());
  session.removeAttribute("user");
  session.invalidate();
  response.sendRedirect(request.getContextPath()) + "/index.jsp");
 } 

Cuando se redirige a una página jsp después de cerrar sesión, la creación del session es diferente del session original (el session por defecto en la página jsp está activado) 

Es decir, después de cerrar sesión, el session que se hace clic en el retorno del navegador y se actualiza es un nuevo session, desde este punto de vista, se considera la solución 

Estoy poniendo un fragmento de datos en el session original, la primera vez que inicio sesión puedo obtener este fragmento de datos, después de cerrar sesión, el session original desaparece, al hacer clic en el retorno del navegador y actualizar, no se ha colocado datos en el nuevo session, el valor obtenido es null 

Comparar los datos de la sesión original con el valor de la nueva sesión, uno tiene un valor, el otro es null, definitivamente fallará en la coincidencia, en este caso se puede proporcionar un mensaje amigable al usuario, y pedirle que inicie sesión nuevamente. 

Entonces, ¿cómo se guardan los datos de la sesión original después de deshabilitar (después de deshabilitar la sesión original, ya no existe)? Considere agregar un campo oculto al formulario, y poner los datos de la sesión original en ese campo oculto, de esta manera, después de deshabilitar hacer clic en el navegador volver a actualizar, el navegador se enviará automáticamente los datos de la sesión original, sin necesidad de guardar manualmente (de hecho, es posible que deba estar en el contexto de aplicación de servletContext, no se ha probado)

Es un poco similar a una manera de solucionar la repetición de envío de formularios, pero aquí no se puede eliminar los datos de la sesión original, porque la sesión antes y después de deshabilitar no son la misma 

Específicamente: en login.jsp

<%
String token=new Random().nextLong()+"";
session.setAttribute("token", token);
%>
<form action="${pageContext.request.contextPath}/servlet/ClientServlet#63;operation=login" method="post">
<table style="width: 50%;">
<tr>
<td aling="right">Nombre:</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td aling="right">Contraseña:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<tr>
<td></td>
<td><input type="submit" value="Iniciar sesión"></td>
</tr>
</table>
<input type="hidden" name="token" value="${sessionScope.token}">
</form> 

En servlet, dar una sugerencia amigable y redirigir a la página de inicio de sesión 

  HttpSession session = request.getSession();
  //Solucionar el problema de que después de deshabilitar retroceder y actualizar el navegador se accede repetidamente
  //Proporcionar un campo de entrada oculto, obtener el valor del campo oculto en el backend
  //Después de deshabilitar, retroceder y actualizar el navegador generará una nueva sesión, de esta manera el sessionToken se obtiene como null
  //Por lo tanto, hiddenToken.equals(sessionToken) siempre será false
  String sessionToken = (String) session.getAttribute("token");
  String hiddenToken = request.getParameter("token");
  if (!hiddenToken.equals(sessionToken)) {
   request.setAttribute("message", "Ha sido anulado, por favor inicie sesión de nuevo,",2segundos después de redirigir a la página de inicio de sesión<meta http-equiv='Refresh' content=2;url="
       + request.getContextPath() + "/client/login.jsp>");
   request.getRequestDispatcher("/client/message.jsp").forward(
     request, response);
   return;
  } 

Prueba: 

Iniciar sesión

 

Después de anular la sesión, hacer clic en el botón de retorno del navegador para refrescar, el navegador le preguntará si desea volver a enviar los datos

 

Hacer clic para volver a enviar

 

De esta manera, se solucionó el problema de hacer clic en la opción de anular sesión y luego en el botón de retorno del navegador para refrescar y volver a iniciar sesión.

Eso es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos nos apoyen y alentemos el tutorial de gritos.

Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente por humanos ni asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar, y proporcione la evidencia relevante. Una vez que se verifique, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará