2012-07-07 59 views
2

我是新手到JSP和我的webapp的特定頁面我試圖確定用戶是否登錄。爲此,我正在檢查會話存在。如果會話不存在,那麼我會將用戶重定向到登錄頁面。JSP會話不爲空

我感到困惑的是下面的代碼

<% 
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 

我不明白爲什麼當我沒有會話,甚至存在不創造它。如何檢查用戶是否登錄?

在此先感謝。

回答

4

默認情況下,會話是由容器爲您創建的。對於JSP使用

<%@ page session="false" %> 

在您的JSP上禁用會話創建。

爲了檢查用戶是否存在,你需要把一些令牌/鑰匙在會議服務器端在用戶登錄後,像

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

和JSP簡單地檢查屬性存在,而不是null

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

而不是檢查整個會話是否存在,您可以使用戶一個會話屬性,並檢查它的存在。

2

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

您可以在用戶登錄時在會話對象中存儲會話屬性,並在他/她註銷時將其刪除。但我建議配置一個「基於容器的認證」,這樣你就不需要在會話中存儲任何屬性,並且可以使用請求方法「getUserPrincipal()」和「getRemoteUser()」來知道用戶已登錄或未登錄。此外,這種認證被證明是更安全的,並與JavaEE原則保持一致。

要獲取有關如何設置容器管理的認證,你可以在所以在這另一個問題就來看看一些指令: Performing user authentication in Java EE/JSF using j_security_check

0

Web容器適用於每一位用戶session.As用戶請求一個唯一的會話標識符Web應用程序中的另一個頁面會話標識符與HttpSession對象一起返回給servlet。

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

HttpSession getSession(boolean create) - 返回與此請求關聯的httpsession對象,如果它有效但無效則僅當「創建」輸入爲「true」時纔會創建新的會話對象。

0

我想在@jdevelop的回答補充一點:

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