2010-06-04 70 views
3

使用Spring MVC 3和JSP,我只是想測試用戶是否登錄,我不想使用Spring Security的目前測試,如果用戶在通過JSP登錄/ Spring的MVC

<jsp:useBean id="myAppUser" type="com.xxx.MyUser" beanName="myUser" scope="session" /> 
<c:choose> 
    <c:when test="myUser.loggedIn"> 
     //dostuff 
    </c:when> 
    <c:otherwise> 
     //dootherstuff 
    </c:otherwise> 
</c:choose> 

但問題是,當會話中還沒有myAppUser時,jsp:useBean會引發異常。現在我意識到我可以擁有JSP:useBean實際上通過給它一個類來實例化對象,但我不喜歡知道某個JSP片段中的某個地方有對象被實例化並添加到我的會話中,所以我要麼總是爲該用戶設置一個初始值,並以編程方式對其進行控制,或者我想要一種方法來獲取該bean,使其不存在或不存在,如果它不存在,則返回null無論哪種方式將罰款

如果我的問題點到了我應該做的,請提供一個鏈接到文件的基本誤解,將詳細解釋這個用例

回答

4

這不是正確的做法,但實際上你可以用JSTL <c:catch>解決特定的問題。

<c:catch var="e"> 
    <jsp:useBean id="myAppUser" type="com.xxx.MyUser" beanName="myUser" scope="session" /> 
</c:catch> 
<c:choose> 
    <c:when test="${empty e && myUser.loggedIn}">Logged in</c:when> 
    <c:otherwise>Bean doesn't exist or user is not logged in</c:otherwise> 
</c:choose> 

正確的方法在回答馬特b。你真的需要在更高的層面上解決它。根據login(User),logout()isLoggedIn()等幾種方法,有一個類似UserManager的bean,它具有User作爲子屬性。如果用戶登錄,則User應該是非空的。當用戶註銷時,則應將User設置爲空。


更新按照註釋:作爲替代方案,也可以剛剛擺脫整個jsp:useBean聲明和攔截對MVC框架的存在,在會話中注入${myUser}

<c:choose> 
    <c:when test="${myUser.loggedIn}">Logged in</c:when> 
    <c:otherwise>Bean doesn't exist or user is not logged in</c:otherwise> 
</c:choose> 

EL將透明地「壓制」潛在的nullpointerexceptions並返回false。

+0

這是我想要的,但我不知道該怎麼做,你所描述的實際上就是我正在做的事情。myAppUser對象是我的業務用戶代碼的一個複合對象,我想要控制它何時被實例化以及如何重新讀取問題你會看到我所要求的是你所描述的,但問題是我不知道如何實現它。你還會注意到你的解決方案有同樣的問題,如果我需要說註銷(用戶),用戶來自哪裏? – walnutmon 2010-06-04 16:27:16

+0

沒有'註銷(用戶)',它只是'logout()'。 'UserManager'本身已經有登錄的'User'引用爲屬性,由'login(User)'傳入。 – BalusC 2010-06-04 16:33:24

+0

你在說UserManager,我只是把它稱爲User,但它們是一樣的東西,我的控制器進行一次服務調用,它返回帶有業務代碼的用戶對象,該代碼抽象出「登錄」實際上意味着什麼以及許多其他事情,我可以稱之爲經理,我想,但我的問題仍然是完全一樣的。經理可能還沒有定義,因爲如果他們沒有登錄,那麼創建經理並將其放置在會話中的代碼還沒有運行。這聽起來像你說的是在spring config – walnutmon 2010-06-04 16:38:49

2

用於測試像「這個人登錄了嗎?」通過檢查View中的Session對象模糊模型,視圖和控制器角色之間的界限。

無論如何計算出正確的JSTL語法來使用不會導致jsp:useBean拋出異常,我建議將登錄檢查移動到控制器端並讓視圖測試是否存在「isLoggedIn」屬性模型。

  1. 控制器檢查所述會話包含一個用戶對象,將一個屬性isLoggedIn與的truefalse值模型。
  2. 視圖中的邏輯分支爲${isLoggedIn}的值。

換句話說,該視圖應被檢查型號爲屬性/數據,而不是直接訪問會話或其他狀態。

+0

解決方案的問題意味着每個與具有在該邏輯上分支的邏輯的頁面相關聯的控制器(從字面上看,每個頁面都至少有一個組件需要諸如用戶名稱之類的東西)需要包括在模型中,基本上控制器必須包含每一次,這意味着從視圖中直接訪問它可能會更容易,這實際上是一回事,這將是一個偏好的論點。我同意,如果這不會在每一頁 – walnutmon 2010-06-04 16:12:10

+0

也是,如果別人寫一個控制器的方法,他們忘記包括用戶登錄狀態,他們的名字,他們的暱稱等,那麼異常將被拋出,如果我要走這條路線,我想要一種方法使其成爲默認行爲 – walnutmon 2010-06-04 16:13:43

+1

您不必在控制器中執行此操作。你也可以有一個servlet過濾器來做到這一點。 – palto 2010-06-04 16:25:34

相關問題