Gymterview
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). Это ключевой нюанс вопроса.