java - 防止 EL 访问 session 属性

标签 java jsp el

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

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

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

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

有没有一种方法可以防止使用某些代码在 JSP 上访问 UserDAO Java 对象的字段,例如:

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

谢谢。

最佳答案

没有。至少,不是没有编写一个非常简单的自定义 EL 解析器。

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

public class UserWrapper implements Serializable {

    private User user;

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

    public User get() {
        return user;
    }

}

改为将其存储在 session 中,如下所示。

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

改为从 session 中获取它,如下所示。

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

此方法在 EL 中不可访问。至少,在 2.2 之前的 EL 版本中,否则您可以执行 #{user.get()}

替代方案是使包装类的 getter 方法受包保护,以便它只能由同一包和/或子类中的类访问(EL 即要求它是公共(public)的)。

    protected User get() {
        return user;
    }

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

关于java - 防止 EL 访问 session 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6337453/

相关文章:

eclipse - Eclipse 中的部署目录在哪里?

java - 嵌套 JSF 表达式字符串

java - 如何从 java 应用程序运行 Windows 命令提示符?

java - Mongodb,仅查找所有最新的映射记录

java - 避免大量实例化 "MyObjectX extends AbstractObject"来调用每个 myObjectX.execute() ?设计模式 ?

java - 使用 EL 调用列表中的方法

jSTL - 在 Scriptlet 和 EL 中使用 ServletContext 和 ServletConfig

java - 专有连接 api 的连接池(非 jdbc)

jsp中的java包

java - JSP访问全局变量