簡體   English   中英

JSP Servlet會話invalidate()不會使會話為空

[英]JSP Servlet session invalidate() does not make session null

我的JSP項目中有三個簡單的HttpServlet類,“LoginServlet”,“LogoutServlet”和“ProfileServlet”。

  • LoginServlet:通過將“name”屬性設置為session來登錄用戶
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM