Как не загружать предыдущую страницу сайта при нажатии кнопки «Назад» в браузере с java с помощью сеансов?

#java #jsp

Вопрос:

У меня есть 4 файла jsp, логин.индекс jsp.представление jsp.выход из системы jsp.jsp.

При входе в систему я создаю сеанс и передаю имя пользователя и пароль пользователя.

Я позволяю ему просматривать индекс и просмотр, и у меня есть простая кнопка на панели навигации для выхода из системы.

выход из системы.jsp:

 <%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="US-ASCII">
<title>Logout Page</title>
</head>
<body>

<h1>You have logged out of the system!</h1>

<a href="login.jsp">Back to the Login Page</a>

<%
    session.invalidate(); // destroy session

    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setHeader("Expires", "0"); // Proxies.
%>
</body>
</html>
 

Во всех моих .jsp файлах у меня есть следующие строки в начале:

 response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.
 

Но если пользователь находится на logout.jsp веб-странице, он может просто нажать кнопку «Назад» браузера и вернуться на предыдущую страницу (либо index.jsp, либо view.jsp).

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

Ответ №1:

В этом вопросе нужно многое осветить, поэтому я постараюсь быть кратким.

Во — первых, вы должны иметь в виду следующее:

  1. HTTP-это протокол без состояния
  2. Код Java выполняется на сервере при отправке HTTP-запроса
  3. Выходные данные вашего процесса Java отправляются в ваш браузер в виде HTML, или JSON, или какого-либо другого текста в HTTP-ответе (который также содержит заголовки HTTP-ответа).
  4. Если вы изменяете HTTP-ответ в Java JSP, он будет выполнен на сервере, и вы увидите результаты в ответе. (вот почему сеанс признан недействительным, и вы увидите, как заголовки исчезнут)
  5. К сожалению, вашему браузеру все равно, что делает Java-код, и когда вы нажмете кнопку «Назад», вы отправите новый HTTP-запрос на предыдущий ресурс JSP, который вы запрашивали.

Вы можете проверить HTTP-ЗАПРОС, чтобы убедиться, что вы не добавляете заголовки, которые могли бы восстановить сеанс и/или аутентифицировать вашего пользователя.

Другим классическим решением проблемы такого рода было бы использование так называемого шаблона проектирования MVC (Model-View-Controller) и выполнение аутентификации и управления сеансами в компонентах(компонентах) контроллера. При таком подходе ваши файлы JSP являются частью компонента ПРЕДСТАВЛЕНИЯ, и вы можете легко делегировать определенные методы контроллера определенным представлениям. Для этого на Java существует множество ресурсов. Вот простое руководство по использованию JSP и сервлетов:

Независимо от используемого вами подхода к кодированию, каждый компонент, обрабатывающий входящий HTTP-запрос, должен проверить его, чтобы убедиться, что текущий пользователь аутентифицирован. Если нет, то отобразите страницу входа в систему. Это проще сделать в компоненте управления, но вы также можете сделать это в JSP, хотя вам может потребоваться импортировать другой JSP для проверки подлинности, чтобы не копировать один и тот же код в несколько файлов.