Ответ 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()
.
Вот некоторые примеры использования в реальном мире:
- Получение SessionScoped bean из HttpSessionListener?
- Как вызвать метод до уничтожения объекта сеанса?
- Вызвать действие при закрытии JSP
- реализация HttpSessionListener
- Как получить доступ к сеансам HTTP в Java
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());
}
}
}
Здесь реальный случай использования: