Недействительный сеанс в сервлетах выхода из системы

HttpSession session  = request.getSession();
try
{      
    session.removeAttribute("logonSessData");
    session.invalidate();                               
    String pageToForward = request.getContextPath();
    response.sendRedirect(pageToForward);           
}
catch (Exception sqle)
{
    System.out.println("error UserValidateServlet message : " + sqle.getMessage());
    System.out.println("error UserValidateServlet exception : " + sqle);
}

в сервлере Logout Я написал код выше в doPost и doGet. После выхода из системы он отображает экран входа в систему, а затем, если я нажму кнопку "Назад", он отобразит предыдущий экран перед выходом из системы, а затем, если я нажму на любую страницу, он отобразит "HTTP Status 500", и теперь, если я нажму F5, тогда он нагревает вход Servlet и получает полный доступ пользователя.

Как остановить эту проблему, покажите, что после выхода из системы с помощью кнопки возврата и F5 пользователь не может использовать какую-либо страницу?

Ответ 1

То, что вы делаете, хорошо. Браузер кэширует предыдущие страницы, и когда вы нажимаете кнопку "Назад", он переходит на предыдущую страницу в кеше.

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

Cache-Control: no-cache

Ответ 2

1) Когда вы нажимаете кнопку "Назад" в браузере, вы получаете предыдущую страницу из-за кеша браузера.

2) Когда вы нажимаете на какую-либо страницу после резервного копирования, вы получаете статус 500, потому что исключение null-указателя из-за того, что объект сеанса уже недействителен.

3) Когда вы обновляете новый запрос на ваш сервлет или JSP, вы вызываете метод request.getSession();, который создает для вас новый объект сеанса.

в результате вы снова получаете полный доступ ко всем страницам.

Чтобы избежать этой проблемы, вы можете выполнить следующие шаги.

1) В приложении создайте один сервлет Ex: LoginCheckerServlet

2) для вышеуказанного сервлета дает шаблон url/*

3) Таким образом, сервлет будет выполнен для всего запроса

4) Теперь в LoginCheckerServlet проверьте имя пользователя и пароль в параметрах запроса

5) Если они приходят, выполните проверку входа в систему и отобразите страницу приветствия

6) Если пароль имени пользователя не подходит, есть два значения

     i)user is already logged in 

    ii)user is trying to access your app illegally

7) Теперь вызовите метод request.getSession(false);, который даст вам объект сеанса, существует уже существующий для этого пользователя сеанс, поэтому вы можете перенаправить на страницу приветствия с доверием к пользователю.

8) request.getSession(false); даст вам нулевое значение, если для этого пользователя не существует сеанса.

9) Если вы не получаете имя пользователя и пароль в параметрах запроса, а request.getSession(false); дает вам нулевое значение, значит, пользователь пытается получить доступ к вашему приложению без входа в систему, теперь вы можете с радостью отобразить запретную страницу.

Ответ 3

В каждом сервлете проверьте, является ли Session нулевым или нет. Если сеанс не является нулевым, то только переадресация запроса будет перенаправлена ​​на страницу входа.

HttpSession session  = request.getSession();

if(Session !=null)
{
try
{      
    // acutal servlet actions

}else
{

  // redirect to login page

 }

Также было бы хорошо, если бы вы добавили нулевую проверку сеанса в свой код выше.

HttpSession session  = request.getSession();
if(session !=null)
try
{      
    session.removeAttribute("logonSessData");
    session.invalidate();                               
    String pageToForward = request.getContextPath();
    response.sendRedirect(pageToForward);           }
catch (Exception sqle)
{
    System.out.println("error UserValidateServlet message : " + sqle.getMessage());
    System.out.println("error UserValidateServlet exception : " + sqle);
}
}else
{
  //session already null/ expired
}

Ответ 4

Что вам нужно сделать, это установить сеанс в атрибут, основанный на сеансе.

request.getSession().setAttribute("sess",request.getSession());

Используйте это, чтобы сравнить его с текущим сеансом. Если это сравнение терпит неудачу, перенаправите его на страницу входа. Это должно быть сделано на каждой странице.

Ответ 5

Это создаст новый сеанс

HttpSession ss = request.getSession(true); //creates a new session.
  if(ss.isNew()){
    ss.invalidate();  //this clears the session
    ss = request.getSession(true); // creates a new session 
    }