防止EL访问会话属性

时间:2011-06-13 23:09:40

标签: java jsp el

我理解如何在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);

有没有办法阻止在JSP上访问UserDAO Java Object的字段,其代码如下:

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

谢谢。

1 个答案:

答案 0 :(得分:4)

没有。至少,并非没有编写自定义EL解析器,这不是一件容易的事。

最好的办法是将它包装在一个不会通过Javabean getter方法公开值的对象中。 E.g。

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;
    }

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