Запретить доступ к атрибуту сеанса с помощью EL - PullRequest
4 голосов
/ 14 июня 2011

Я понимаю, как получить доступ к атрибутам сеанса с помощью EL в моем приложении JSP / Servlet:

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

Однако мне было интересно, есть ли способ скрыть переменную Session от доступа EL к странице JSP? Если я установлю переменную сеанса в моем сервлете, например:

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

Есть ли способ предотвратить доступ к полям JavaDAO объекта UserDAO в JSP с помощью некоторого кода, такого как:

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

Спасибо.

1 Ответ

4 голосов
/ 14 июня 2011

Нет.По крайней мере, не без написания специального распознавателя EL, который не совсем тривиален.

Лучше всего обернуть его в объект, который не раскрывает значение с помощью метода получения Javabean.Например,

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.По крайней мере, в версиях EL до 2.2, где в противном случае вы могли бы просто сделать #{user.get()}.

Альтернативы заключаются в том, чтобы сделать метод getter класса оболочки защищенным, чтобы он был доступен только для классов в том же пакете и/ или подклассы (EL требует, чтобы это было публично).

    protected User get() {
        return user;
    }

Или даже сделать весь класс-оболочку внутренним классом, закрытым или защищенным пакетом.

...