Убейте сеанс и переадресовывайте его на страницу входа при нажатии кнопки выхода

У меня есть следующий код в JSP:

<%
    if(session.getAttribute("Username") == null || session.getAttribute("Username") == "_INVALID_")
    {
        response.sendRedirect("LoginPage.html");
    }
%>

<form>
    <input type="button" value="Change Account Details" onClick="location.href='ChangeDetails.jsp'">
    <br></br>
    <input type="button" value="Add Customers" onClick="location.href='AddCustomers.jsp'">
    <br></br>
    <input type="button" value="Manage Flights" onClick="location.href='ManageFlights.jsp'">
    <br></br>
    <input type="button" value="Book Flights" onClick="location.href='BookFlights.jsp'">
    <br></br>
    <input type="button" value="Log Out" onClick="location.href='LoginPage.html'">
</form>

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

Ответ 1

Чтобы убить текущий сеанс, вам в основном нужно вызвать HttpSession#invalidate() и выполнить перенаправление на логин или главную страницу. Этот код должен быть помещен в метод doPost() servlet, который вызывается запросом POST.

например.

<form action="${pageContext.request.contextPath}/logout" method="post">
    <input type="submit" value="Logout" />
</form>

с

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getSession().invalidate();
        response.sendRedirect(request.getContextPath() + "/LoginPage.html");
    }

}

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

Кроме того, существует еще одна потенциальная проблема, когда конечный пользователь использует кнопку назад для перехода назад в историю. По умолчанию браузер будет кэшировать все ответы, и, таким образом, кнопка "Назад" может отображать страницу из кеша браузера, а не запрашивать совершенно новое прямо с сервера. Чтобы исправить это, см. Этот связанный вопрос Предотвратить доступ пользователя к ранее посещаемой защищенной странице после выхода из системы

И последнее, но не менее важное: у вас есть довольно странный HTML. Кнопки с onClick для навигации? Как пользователь и SEO недружелюбны. Вместо этого используйте обычные <a> ссылки. Для кнопки look'n'feel, введите CSS.

Ответ 2

Вы должны взглянуть на метод invalidate() метода HttpSession. Сессию можно получить с помощью метода HttpServletRequest getSession().

Вы также должны взглянуть на заголовки Expires, Cache-Control, Pragma http, например: Предотвратить переход пользователя на предыдущую защищенную страницу после выхода из системы.

Ответ 3

попробуйте это, чтобы убить сеанс

HttpSession newsession = request.getSession(false);
    if (newsession != null) 
    {
         newsession.invalidate();

    }

   response.sendRedirect("../index.jsp");