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

Решение проблемы повторного входа после注销 пользователя javaweb, если пользователь нажимает кнопку "Вернуться" в браузере

Недавно я пишу веб-сайт для покупки книг, и при тестировании функции отказа от авторизации при нажатии на кнопку 'назад' в браузере, обнаружил, что пользователь, который уже вышел из системы, снова авторизовался 

Я думал много и искал много способов в Интернете, но большинство из предложенных методов реализуются с помощью JavaScript, чтобы запретить пользователю нажимать кнопку 'назад' в браузере после отказа от авторизации 

Этот метод хотя и рабочий, но не решает проблему на самом деле в后台, как будто мы предотвращаем несправедливость, но не предотвращаем кражу 

Ниже я записываю реализованный мною метод 

Принцип: 

После отказа от авторизации при нажатии на кнопку 'назад' в браузере на самом деле браузер отправляет информацию из исходной формы еще раз 

Отказ от авторизации означает удаление исходной сессии

// Отказ от авторизации
 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");
 } 

Когда после выхода из системы вас перенаправляют на jsp-страницу, сессия генерируется differently, чем исходная сессия (сессия по умолчанию включена в jsp-странице) 

Следовательно, после выхода из системы, при нажатии на кнопку 'назад' в браузере, сессия является новой сессией, с этой точки зрения можно думать о способах решения проблемы 

Я поместил данные в исходную сессию, при первом входе в систему я могу получить эти данные, после выхода из системы исходная сессия исчезает, после нажатия на кнопку 'назад' в браузере, новые данные сессии не добавляются, и полученное значение будет null 

Соответствие данных в исходной сессии новым значениям сессии, один из них имеет значение, а другой равен null, обязательно приведет к ошибке совпадения, в этом случае можно предоставить пользователю дружествкое сообщение и попросить его повторно авторизоваться. 

Как же сохранить данные из прежнего session после выхода (прежний session исчезает после выхода)? Рассмотрите возможность добавления скрытого поля в форму, где будут放置 данные из прежнего session, так что после выхода и刷新 браузера, браузер автоматически отправит данные из прежнего session, без необходимости ręчно их сохранять (по факту, возможно, их нужно сохранить в контексте приложения servletContext, не проверял)

Это несколько похоже на способ решения повторной отправки форм, но здесь нельзя удалять данные из прежнего session, так как перед и после выхода это не один и тот же session 

Конкретно: в файле login.jsp

<%
String token=new Random().nextLong()+"";
session.setAttribute("token", token);
%>
<form action="${pageContext.request.contextPath}/servlet/ClientServlet?operation=login" method="post">
<table style="width: 50%;">
<tr>
<td align="right">Имя:</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td align="right">Пароль:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<tr>
<td></td>
<td><input type="submit" value="Вход"></td>
</tr>
</table>
<input type="hidden" name="token" value="${sessionScope.token}">
</form> 

В servlet, предоставьте дружествкое сообщение и перейдите на страницу входа 

  HttpSession session = request.getSession();
  //Решение проблемы повторного входа после выхода и刷新 браузера
  //Предоставить скрытое поле ввода, чтобы сервер мог получить значение скрытого поля
  //После выхода и刷新 браузера будет создан новый session, и таким образом sessionToken будет равен null
  //Так что hiddenToken.equals(sessionToken) всегда будет false
  String sessionToken = (String) session.getAttribute("token");
  String hiddenToken = request.getParameter("token");
  if (!hiddenToken.equals(sessionToken)) {
   request.setAttribute("message", "Вы вышли из системы, пожалуйста, заново войдите, через 2 секунды будет перенаправлено на страницу входа<meta http-equiv='Refresh' content=2;url="
       + request.getContextPath() + "/client/login.jsp>");
   request.getRequestDispatcher("/client/message.jsp").forward(
     request, response);
   возврат;
  } 

Тест: 

Вход

 

После аннулирования, если вы вернетесь в браузер и обновите страницу, браузер будет запросить повторную отправку данных

 

Нажмите для повторной отправки

 

Таким образом, проблема с возвращением в браузер после аннулирования и обновлением пользователя для повторного входа решена.

Вот и все содержание этой статьи, надеюсь, это поможет вам в изучении, и希望大家多多支持呐喊教程。

Заявление: содержание этой статьи взято из интернета, авторские права принадлежат соответствующему автору. Контент был自发но предоставлен пользователями Интернета и загружен на этот сайт. Этот сайт не обладает правами собственности, не做过人工编辑处理,也不承担相关法律责任。 Если вы обнаружите спорное содержимое о нарушении авторских прав, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для жалоб и предоставьте соответствующие доказательства. При обнаружении фактов, этот сайт немедленно удалят спорное содержимое.

Вам может понравиться