[英]Java servlet, session: null session gets created, can't invalidate it
我有一個接受用戶名並將其傳遞給LoginServlet.java
的表單,后者依次是:
LoginResultView.jsp
,該消息將LoginResultView.jsp
“成功登錄,%username%”消息 形式 :
<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>
servlet的:
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
會話來自何處? 我如何解決它?
您獲得的會話不為空。 否則,您將獲得NPE。
您需要將session="false"
屬性放入Navbar JSP的<%@page%>
指令中。 否則,當首次訪問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"
放入page指令,則檢查必須為if ( session == null )
。 那就是你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.