【问题标题】:Prevent session attribute access by EL防止 EL 访问会话属性
【发布时间】:2011-06-13 23:09:39
【问题描述】:

我了解如何在我的 JSP/Servlet 应用程序中使用 EL 访问 Session 属性:

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

但是,我想知道是否有办法从 JSP 页面 EL 访问中隐藏 Session 变量?如果我在我的 servlet 中设置一个会话变量,例如:

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

有没有办法通过一些代码来防止 UserDAO Java 对象的字段在 JSP 上被访问,例如:

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

谢谢。

【问题讨论】:

    标签: java jsp el


    【解决方案1】:

    没有。至少,如果不编写一个自定义的 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;
        }
    

    或者甚至使整个包装类成为私有或受包保护的内部类。

    【讨论】:

    • 如此简单,就在我面前。非常感谢你。使用 Wrapper (Hider) 类也很容易实现。
    • 只是为了更新这个问题的其他人,我将 UserWrapper 类实现为它自己的可序列化类,然后使 User get() 函数成为包私有方法。然后将包装类与我的 Authenticator 类放在同一个包中,从而允许任何其他类在会话中设置用户对象,但只允许 Authenticator 类从会话中解包(访问)用户对象。再次感谢 BalusC
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    相关资源
    最近更新 更多