У меня есть форма, которая берет имя пользователя и передает его LoginServlet.java
, что в свою очередь:
- Если сеанса нет: создает сеанс для этого имени пользователя и перенаправляет запрос на
LoginResultView.jsp
, который выводит сообщение «Успешный вход в систему,% username%»
- Если сеанс уже существует, выдает «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
сеанс? Как мне это исправить?