簡體   English   中英

JSP會話不為空

[英]JSP session is not null

我是JSP的新手,並且在我的Web應用程序的特定頁面上,我試圖確定用戶是否已登錄。為此,我正在檢查會話是否存在。 如果會話不存在,那么我會將用戶重定向到登錄頁面。

我對以下代碼感到困惑

<%
if (null == session)
    out.println("session is null");
else
    out.println("session is not null");

if (null == request.getSession(false))
    out.println("request.getSession() is null");
else
    out.println("request.getSession() is not null");
%>

在任何情況下都會產生以下輸出:

session is not null request.getSession() is not null 

我不理解為什么即使沒有創建會話也存在。 如何檢查用戶是否登錄?

提前致謝。

默認情況下,會話是通過容器為您創建的。 供JSP使用

<%@ page session="false" %>

在JSP上禁用會話創建。

為了檢查用戶是否存在,您需要在用戶登錄后在服務器端的會話中放入一些令牌/密鑰。

request.getSession().setAttribute("usertoken","authenticated");

在JSP上,只需檢查屬性是否存在且不為null

if ("authenticated".equals(session.getAttribute("usertoken")) {
   // do something
}

每當有用戶瀏覽您的網站時,都會有一個會話。 是否登錄用戶的檢查不應該依賴於“會話存在”,因為它們是非常不同的概念。

您可以在用戶登錄時將會話屬性存儲在會話對象中,並在用戶注銷時將其刪除。 但我建議您配置“基於容器的身份驗證”,這樣您就無需在會話中存儲任何屬性,並且可以使用請求方法“ getUserPrincipal()”和“ getRemoteUser()”來了解用戶是否登錄。 此外,事實證明,這種身份驗證更加安全,並且符合JavaEE原則。

要獲得有關如何設置容器管理的身份驗證的一些說明,您可以看看SO中的另一個問題: 使用j_security_check在Java EE / JSF中執行用戶身份驗證

您可以使用戶成為會話屬性並檢查其存在,而不是檢查整個會話是否存在。

Web容器為每個用戶會話保留唯一的會話標識符。當用戶請求Web應用程序中的另一個頁面時,該會話標識符將與HttpSession對象一起返回給servlet。

HttpSession getSession()-如果有效,則始終返回與此請求關聯的httpsession對象,以防invalid將創建一個新的會話對象。

HttpSession getSession(boolean create)-如果此請求有效,則返回與此請求關聯的httpsession對象,但如果無效,則僅在“ create”輸入為“ true”時創建一個新的會話對象。

我想在@jdevelop的答案上再加一點:

一旦在JSP頁面中寫入<%@ page session="false" %>session對象將直接不可用。 這就是為什么您必須使用request.getSession(false) (當然,您必須添加null檢查)來訪問會話對象的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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