2009-11-26 2 views
1

У меня есть объект, который реализует HttpSessionAttributeListener, и, как вы ожидаете, он выполняет некоторую работу, когда некоторые объекты добавляются, заменяются и удаляются из сеанса.attributeRemoved не вызывается после session.invalidate

Я думал, что если сеанс завершен [session.invalidate()], каждый объект из этого сеанса будет удален из сеанса, так как будет вызван метод attributeRemoved()? Я не вижу этого повода и задаюсь вопросом, видел ли я это.

Чтобы гарантировать, что я могу быть уведомлен о том, что сеанс недействителен, должен ли я реализовать HttpSessionBindingListener на объекте, который меня интересует? или есть другой путь.

ответ

1

Когда вы вызываете session.invalidate(), вы просто сообщаете контейнеру, что сеанс больше не должен использоваться. Однако он не обязан делать что-либо еще, например, удаление атрибутов сеанса. В конечном итоге это будет сделано, но нет никакой гарантии, что он сделает это немедленно, и ваше приложение не должно полагаться на то, что это происходит своевременно.

+0

Спасибо, вы знаете, если session.invalidate() может вызвать контейнер для уведомления сессионных объектов (реализующие HttpSessionBindingListener), что они теперь несвязанные? – scottyab

+0

Он должен уведомить их, когда они действительно освобождаются, но это может произойти в любое время после того, как сессия будет признана недействительной, без каких-либо гарантий относительно того, когда. – skaffman

0

HttpSessionListener, реализовать метод sessionDestroyed

+0

Когда sessionDestroyed вы не можете получить какие-либо объекты из сеанса, если вы попытаетесь, я думаю, вы получите sessionInvlaidException (или подобное исключение) – scottyab

+0

Ну, я не пробовал, но, смотря на код Tomcat, кажется что прослушиватели называются ПРЕЖДЕ ЧЕМ сессия недействительна, а attibutes удаляются. – Bozho

Смежные вопросы