Подтвердить что ты не робот

Практическое использование HttpSessionBindingListener и HttpSessionAttributeListener

Я читаю первую голову JSP и сервлеты. Пройдя через разных типов слушателей, я наткнулся на HttpSessionBindingListener и HttpSessionAttributeListener.

Я думал о различии между ними - я хочу увидеть практические занятия в реальных примерах этих двух слушателей. Я тестировал HttpSessionBindingListener путем реализации valueBound() и valueUnBound() - зачем объекту нужно знать, было ли оно добавлено или нет?

Я довольно запутался в практических занятиях. Пожалуйста, помогите в разъяснении этого.

4b9b3361

Ответ 1

HttpSessionBindingListener должен быть реализован в классе, экземпляры которого могут храниться в сеансе, например, вошедший в систему пользователь,

например.

public class ActiveUser implements HttpSessionBindingListener {

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        logins.add(this);
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        logins.remove(this);
    }

}

Когда экземпляр этого ActiveUser будет установлен как атрибут сеанса на HttpSession#setAttribute(), тогда будет вызван valueBound(). Когда он удаляется либо HttpSession#removeAttribute(), либо недействительным сеанса, либо заменяется другим HttpSession#setAttribute(), тогда будет вызываться valueUnbound().

Вот некоторые примеры использования в реальном мире:

HttpSessionAttributeListener должен быть реализован в виде приложения @WebListener, которое вызывается, когда любой атрибут добавляется, удаляется или заменяется в HttpSession. Продолжая приведенный выше пример ActiveUser, это особенно полезно, если вы не можете изменить класс ActiveUser для реализации HttpSessionBindingListener (потому что это сторонний участник или около того) или когда вы хотите использовать "интерфейс маркера" "на произвольном количестве классов, чтобы вы могли выполнять работу по прослушиванию в одном центральном месте.

@WebListener
public class ActiveUserListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        if (event.getValue() instanceof ActiveUser) {
            logins.add(event.getValue());
        }
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        if (event.getValue() instanceof ActiveUser) {
            logins.remove(event.getValue());
        }
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        if (event.getValue() instanceof ActiveUser) {
            logins.add(event.getValue());
        }
    }

}

Здесь реальный случай использования: