![](/img/trans.png)
[英]Java servlet, session: null session gets created, can't invalidate it
[英]JSP Servlet session invalidate() does not make session null
我的JSP項目中有三個簡單的HttpServlet類,“LoginServlet”,“LogoutServlet”和“ProfileServlet”。
最后兩個servlet如下所示我認為是有問題的。
@SuppressWarnings("serial")
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out=response.getWriter();
HttpSession session=request.getSession(false);
session.invalidate();
request.getRequestDispatcher("link.jsp").include(request, response);
out.print("You are successfully logged out!");
out.close();
}
}
和
@SuppressWarnings("serial")
public class ProfileServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
request.getRequestDispatcher("link.jsp").include(request, response);
HttpSession session = request.getSession(false);
if (session != null) {
String name = (String) session.getAttribute("name");
out.print("Hello, " + name + " Welcome to Profile");
} else {
out.print("Please login first");
request.getRequestDispatcher("login.html").include(request,
response);
}
out.close();
}
}
和link.jsp:
<% HttpSession nsession = request.getSession(false);
if(nsession == null) {
%>
<a href="login.html">Login</a>
<%
}
else {
%>
<a href="LogoutServlet">Logout</a>
<%
}
%>
<a href="ProfileServlet">Profile</a>
<hr/>
問題是當用戶登錄時,單擊“Logout”鏈接並調用“LogoutServlet”時,會話未正確無效且ProfileServlet仍然打印出來
"Hello, null Welcome to Profile"
而不是重定向到“login.html”頁面,因為會話仍然是空的。 因此,“link.jsp”頁面上未顯示“登錄”鏈接。 這會阻止用戶再次嘗試登錄。
編輯:為了澄清問題,我創建了一個新的html頁面並更新了要執行的servlet
request.getRequestDispatcher("link.html").include(request, response);
和“link.html”。
<a href="login.html">Login</a>
<a href="LogoutServlet">Logout</a>
<a href="ProfileServlet">Profile</a>
<hr/>
有趣的是,這就是我想要的! 我想問題是
request.getRequestDispatcher("link.jsp").include(request, response);
但我無法解釋為什么......
在JSP中,默認情況下會創建新會話,如果不存在,那么您將始終獲得非空會話。 您可以通過向頁面添加以下頁面指令來禁用它:
<%@ page session="false" %>
有關更多信息,請查看以下內容為什么設置JSP頁面session =“false”指令?
當它調用invalidate()
它會從服務器上下文中刪除該會話以及該會話的所有相關數據,
當您創建新請求時,它會創建一個新請求,因此您將null
視為數據,因為新會話中沒有數據
您應檢查session
的邏輯屬性以驗證用戶是否已登錄,而不是會話本身
這可能有助於您檢查條件檢查。
要檢查的條件:
<%
if (session.getAttribute("name") == null ||
session.getAttribute("name").equals(""))
{
response.sendRedirect("login.jsp");
}
%>
注銷時設置:
session.setAttribute("name", "");
session.invalidate();
response.sendRedirect("login.jsp");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.