2013-04-04 77 views
1

我使用Struts2框架。在jsp中,我在項目中顯示了一個登錄框,當用戶單擊登錄按鈕時,我將一個名爲「loggedin」的cookie設置爲一個操作類中的值爲「true」的cookie。如何檢查用戶是否登錄或不在Java EE中

然後返回「成功」將再次加載此登錄頁面。

在登錄頁面:

<body> 
<% 
Cookie cookie[] = request.getCookies(); 
for(c : cookie) 
{ 
if(c.getName().equals("loggedin")) 
{ 
    if(!c.getValue().equals("true")) 
    { 

%> 
//show login form here. 

<% 

    }//end inner if 

    else //if cookie "loggedin" value is "true" 
    { 

%> 

//show username/profile picture/logout button here 

<% 
    }//end else 
}//end outer if 
}/end for loop 
%> 
</body> 

我有一個問題。當我點擊登錄表單中的登錄按鈕時,會設置一個cookie並重新加載頁面。但是,而不是一個用戶名/個人資料圖片,登錄表單仍然顯示,直到我手動重新加載頁面。

  1. 我該如何解決這個問題?
  2. 我認爲這不是檢查登錄或不是正確的方式。有人可以告訴我如何以另一種方式檢查此問題嗎?
+0

與登錄相比,您可能會考慮主動記錄其他用戶會話。難以跟蹤登錄信息,但設置「最後登錄」以及cookie與身份驗證匹配的散列是一種「簡單」方法。 – 2013-04-04 01:20:27

+9

這在多個層面上是錯誤的。最簡單的方法是將某個會話值設置爲某個事物(比如說,一個「用戶」對象),以表明存在已登錄的用戶,然後檢查是否存在該值。 **使用JSTL,而不是SCRIPTLETS。** – 2013-04-04 02:34:03

+2

或Struts2標籤和OGNL,而不是JSTL :) – 2013-04-04 09:35:13

回答

6

請!請 !不要使用scriptlets。他們很難維護,每個開發者都討厭他們。

有很多方法可以跟蹤會話。

  • 使用Cookie
  • URL重寫
  • 隱藏PARAMS

這些都是很好的網絡上documented。生成會話的最快方法是執行HttpSession session = request.getSession(true);。創建後,您可以繼續將會話信息附加到此對象。

看一看JSTL primer並在why scriptlets are bad上咆哮。

4

在jsp中使用scriptlet永遠不會被推薦。爲什麼你不使用struts標籤或JSTL標籤。 使用會話在每次成功登錄時設置會話屬性,並檢查會話以及用於檢查用戶登錄的特定屬性。像:

//on successfull login... 
Session session=request.getSession(true); 
session.setAttribute("id",id); //here in place of id you can use something related to user, that can uniquely identify to each user. 


// now to check for user logged in or not 

Session session=request.getSession(false); 
// by providing false value it will try to access a session already available, but it won't create a new session. 
//now you can check like this.. 
if(session!=null) 
{if(((String)session.getAttribute("id")).equals(id)) 
    { 
    // do your stuffs here......... 
    } 

else 
    { 
    // you can send the control to login page or to somewhere else as your requirement. 
    } 



    } 

else{ 

// send the control to login page because session object is null... 
} 

而且最重要的是,不要把所有這些邏輯寫在你的jsp中。 Jsp應該只放置視圖邏輯。在struts中把所有的商業/主要邏輯放在Action類中。

+1

+1,但不需要getSession(false),然後檢查會話是否爲空...請參閱會話,if它是新的,該屬性不會在那裏,所以檢查將工作相同(在你的情況下,你應該加倍你的其他部分,發送控制到登錄頁面,即使會話爲空,不僅是當有效但用戶沒有登錄) – 2013-04-04 09:37:50

+0

@AndreaLigios:其實有時候我正在使用,正如你所解釋的,但我從未像你所描述的那樣專注於差異。我知道了。謝謝你的建議。 – 2013-04-04 09:45:03

+0

@Andrea Ligios:請不要介意。同時考慮你的觀點我有一個查詢。 如果在某些時候,我們每次都會創建一個新會話,以便不必要地檢查用戶的會話,它會給服務器帶來負擔,因爲每次它都會在每個用戶/客戶端/瀏覽器的服務器端創建一個會話對象。盡我所知,我們需要每次都使會話無效,否則在瀏覽器關閉或超時時會被銷燬。請讓我知道如果我錯了或提供你的好建議。 – 2013-04-12 06:35:56