English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Недавно я пишу веб-сайт для покупки книг, и при тестировании функции отказа от авторизации при нажатии на кнопку 'назад' в браузере, обнаружил, что пользователь, который уже вышел из системы, снова авторизовался
Я думал много и искал много способов в Интернете, но большинство из предложенных методов реализуются с помощью 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 (во время отправки письма, пожалуйста, замените # на @) для жалоб и предоставьте соответствующие доказательства. При обнаружении фактов, этот сайт немедленно удалят спорное содержимое.