middle
Как уведомить объект в сессии, что сессия недействительна или закончилась
Для уведомления объекта об окончании или инвалидации сессии используется интерфейс javax.servlet.http.HttpSessionBindingListener. Объект, реализующий этот интерфейс, автоматически получает callback при добавлении в сессию и удалении из неё.
Пример
public class UserData implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
// Вызывается при session.setAttribute("user", this)
// Например: зарегистрировать пользователя как online
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// Вызывается при session.removeAttribute("user")
// или при session.invalidate(), или при таймауте
// Например: освободить ресурсы, пометить пользователя как offline
}
}
В отличие от HttpSessionAttributeListener, который регистрируется глобально через web.xml и отслеживает все атрибуты всех сессий, HttpSessionBindingListener реализуется самим объектом, который помещается в сессию. Это позволяет объекту управлять своим жизненным циклом в привязке к сессии.
На собеседовании: обязательно укажите разницу между
HttpSessionBindingListener(реализуется объектом) иHttpSessionAttributeListener(глобальный, черезweb.xml). Это ключевой нюанс вопроса.