Сервлет Java, сессия: нулевой сеанс создан, не может сделать его недействительным - PullRequest
0 голосов
/ 25 января 2019

У меня есть форма, которая берет имя пользователя и передает его LoginServlet.java, что в свою очередь:

  1. Если сеанса нет: создает сеанс для этого имени пользователя и перенаправляет запрос на LoginResultView.jsp, который выводит сообщение «Успешный вход в систему,% username%»
  2. Если сеанс уже существует, выдает «wow ...» и делает недействительным старый сеанс:

форма

<form method="POST" action="LoginResult.do">
  <div>
     <label id="username-label" for="usr">username:</label><br/><br/>
     <input type="text"
            value="Enter a username"
            class="form-control form-input-field form- username-input-field default"
            id = "form-username-input-field" name="login-username"
     >                        
  </div>

  <button class="btn btn-success" type="submit">Sign up</button>
</form>

сервлет:

public class LoginServlet extends HttpServlet {
     public void doPost(HttpServletRequest request, HttpServletResponse response) throws
                                                                        IOException, ServletException {
        String username = request.getParameter("login-username");

        response.setContentType("text/html");
        HttpSession session = request.getSession(false);  

        if (session==null)  {
                session = request.getSession(true);  
                session.setAttribute("loginUsername", username);
                RequestDispatcher view= request.getRequestDispatcher("view/LoginResultView.jsp");
                view.forward(request, response);
        }
        else  {
                response.getWriter().println(
                        "wow, how are you here, " + 
                        session.getAttribute("loginUsername"));
                response.getWriter().println(
                        session.getMaxInactiveInterval());
                session.invalidate();
        }

    }
}

У меня также есть панель навигации, на которой, если сеанса нет, отображаются две кнопки: «Войти» и «Зарегистрироваться», а при наличии сеанса отображается атрибут loginUsername, связанный с этим сеансом:

<% HttpSession session2 = request.getSession(false);
     if (session.getAttribute("loginUsername") != null) {
%>
          <div class="dropdown navbar-link">
              <button class="btn btn-secondary dropdown-toggle"
                     type="button" id="dropdownMenuButton"
                     data-toggle="dropdown"
                     aria-haspopup="true" aria-expanded="false">
                 <a href="${pageContext.request.contextPath}/Login.jsp">                              
                   <%out.println(session2.getAttribute("loginUsername"));%>
                 </a>
              </button>

              <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                 <a class="dropdown-item"
                                     href="${pageContext.request.contextPath}">Profile</a>
                 <a class="dropdown-item"
                     href="#">Link2</a>
                 <a class="dropdown-item"
                  href="${pageContext.request.contextPath}/LogoutResult.do">                                
                      Log out
                  </a>
              </div>
     </div>

        <%
             }
             else  {
         %>
             <a href="${pageContext.request.contextPath}/Login.jsp"
                class="btn btn-info" role="button">Log in
             </a>

             <a href="${pageContext.request.contextPath}/Login.jsp"
                               class="btn btn-info" role="button">Sign up
             </a>


        <%
             }
        %>

Проблема заключается в следующем: даже если, по-видимому, нет сеанса (это две кнопки «Вход» и «Регистрация»), когда я заполняю форму и отправляю ее на LoginServlet, я все равно получаю сообщение wow, how are you here, null 120 (120 session-timeout, указанный в файле web.xml). Затем я могу только отправить данные формы, отправив те же самые данные POST снова (я нажимаю круглую кнопку Обновить и нажимаю ОК, чтобы сохранить предыдущие данные). Только после этого я получаю страницу LogoutResultView.jsp.

Почему это происходит? Откуда этот null сеанс? Как мне это исправить?

1 Ответ

0 голосов
/ 25 января 2019

Сессия, которую вы получаете, , а не ноль. В противном случае вы бы получили NPE.

Вам необходимо поместить атрибут session="false" в директиву <%@page%> вашей JSP-панели Navbar. В противном случае сеанс генерируется немедленно при первом посещении JSP. Например: `

<%@ page language="java" contentType="text/html; charset="ISO-8859-1"
         pageEncoding="ISO-8859-1" session="false"
         import="java.util.*" %>`

Атрибут session по умолчанию имеет значение true, поэтому, если он явно не установлен, сеанс всегда будет создаваться в фоновом режиме, если его не существует.

Итак, if (session.getAttribute("loginUsername") != null) не генерирует NPE, как обычно.

Если вы введете session="false" в директиву вашей страницы, проверка должна быть if ( session == null ). Вот хочешь, хочешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...