2011-06-13 81 views
4

訪問我瞭解如何訪問會話屬性使用EL在我的JSP/Servlet應用:防止會話屬性由EL

<p> Hello <c:out value="${sessionScope.userName}"/> </p> 

不過,我想知道是否有隱藏從JSP頁面會話變量的方式EL訪問?如果我把我的servlet會話變量,如:

UserDAO user = new UserDAO(); 
    user.setUserName("XYZ"); 
    request.getSession().setAttribute("user", user); 

是否有辦法防止這種UserDAO的Java對象的字段在JSP被訪問了一些代碼,如:

<p> Hello <c:out value="${user.userName}"/> </p> 

謝謝。

回答

4

沒有。至少,不是沒有寫一個自定義的EL解析器,這不是一件小事。

最好的辦法是將它封裝在一個不會通過Javabean getter方法公開值的對象中。例如。

public class UserWrapper implements Serializable { 

    private User user; 

    public UserWrapper(User user) { 
     this.user = user; 
    } 

    public User get() { 
     return user; 
    } 

} 

改爲將其存儲在會話中,如下所示。

session.setAttribute("user", new UserWrapper(user)); 

取而代之,從會話中獲取它。

User user = ((UserWrapper) session.getAttribute("user")).get(); 

該方法在EL中不可訪問。至少在2.2版本的EL版本中,你可以只用#{user.get()}

替代方法是使封裝類的getter方法受到封裝保護,以便它只能由同一包和/或子類中的類訪問(EL即要求它是公共的)。

protected User get() { 
     return user; 
    } 

或甚至使整個包裝類爲私有或包保護的內部類。

+0

這麼簡單,就在我面前。非常感謝你。使用Wrapper(Hider)類也很容易實現。 – oberger 2011-06-13 23:48:49

+0

不客氣。 – BalusC 2011-06-13 23:52:09

+0

僅僅爲了解這個問題的其他人而更新,我實現了UserWrapper類作爲它自己的可序列化類,然後使User get()函數成爲包私有方法。包裝類隨後被放置在與我的Authenticator類相同的包中,從而允許任何其他類在會話中設置用戶對象,但只允許Authenticator類從會話中解包(訪問)User對象。再次感謝BalusC – oberger 2011-06-14 18:53:50