Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > выполнение действий перед разрушением сесии


Автор: integral 29.4.2009, 11:43
Добрый день,
необходимо получить из сесии атрибут (строка) и выполнить с его помощью некоторые действия. В HttpSessionListener метод sessionDestroyed вызывается после разрушения сесии и атрибут не молучается извлечь. Придумалось решение, ложить в сесию не строку, а объект класса реализовывающего HttpSessionBindingListener - но такой способ не очень нравится, т.к. требует рефакторинга все кода, где упоминается данный атрибут. Может есть более простые решения?
спасибо)

Автор: AntonSaburov 29.4.2009, 12:27
наверно надо выделить все обращения к данному аттрибуту в отдельный метод и соответственно сохранение этого аттрибута тоже в отдельный метод.
Ну а дальше дело техники - хоть в базу данных сохраняй, хоть в файл. И вытаскивай тоже.

Автор: ivg 29.4.2009, 12:44
Цитата(integral @  29.4.2009,  13:43 Найти цитируемый пост)
В HttpSessionListener метод sessionDestroyed вызывается после разрушения сесии и атрибут не молучается извлечь.

Интересно при каких условиях это происходит, потому что вроде как получается извлечь. Tomcat 6.0.18, Servlet 2.5

Автор: integral 29.4.2009, 12:46
логичноsmile но хотелось бы узнать, обезательно ли для того, что бы получить возможность выполнять действия перед операцией разрушения сесии нужно, что бы сохраняемый в сесию объект реализовывал HttpSessionBindingListener?

Добавлено @ 12:50
Цитата(ivg @  29.4.2009,  12:44 Найти цитируемый пост)
Интересно при каких условиях это происходит, потому что вроде как получается извлечь. Tomcat 6.0.18, Servlet 2.5 

точно? вобще как-бы Note that HttpSessionListener.sessionDestroyed is invoked _after_ a
session is invalidated.
 
 у меня томкет 6 и падает IllegalAccessError  ошибся IllegalStateException, а вот на томкете 5 работает - там баг такой был, что сесия не разрушалась (№3735)

Автор: ivg 29.4.2009, 13:00
Цитата(integral @  29.4.2009,  14:46 Найти цитируемый пост)
Note that HttpSessionListener.sessionDestroyed is invoked _after_ a
session is invalidated
Можно ссылку?
И пример кода, я у себя проверю.
Вообще странно, надо бы разобраться...

Автор: integral 29.4.2009, 13:14
Цитата(ivg @  29.4.2009,  13:00 Найти цитируемый пост)
Можно ссылку?

http://www.velocityreviews.com/forums/t125437-logout-methods-suggestions-please.html
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSessionListener.html#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
http://www.xyzws.com/Servletfaq/when-do-i-use-httpsessionlistener/7

Да пример кода любой сойдет, вот кусочек:
Код

public class SessionProcessor implements HttpSessionListener {

        private static int activeSessions = 0;

        public void sessionCreated(HttpSessionEvent se) {
                activeSessions++;
        }

        public void sessionDestroyed(HttpSessionEvent e) {
          HttpSession session = e.getSession();
          TSUDobj app=(TSUD)session.getAttribute("knownTSUD");  // got IllegalStateException
        }
}

Автор: integral 29.4.2009, 14:27
проблема усугудилась тем, что как показал тест sessionDestroyed вызывается перед valueUnbound
поэтому, как все таки выполнить действия перед тем, как сесия станет инвалидной??

Автор: ivg 29.4.2009, 14:27
Цитата(integral @  29.4.2009,  15:14 Найти цитируемый пост)
http://www.velocityreviews.com/forums/t125...ons-please.html

Там пост 2003 года  smile
Стэк-трэйс этого исключения покажите.
Должно всё работать вроде. invalidate() ни в каких листенерах не вызывается случайно?

Автор: integral 29.4.2009, 14:56
ну 2003 но с того времени, я полагаю, принцып работы не должен был изменится):
стек-трейс:
Код

java.lang.IllegalStateException: getAttribute: Session already invalidated
    at org.apache.catalina.session.StandardSession.getAttribute(StandardSession.java:982)
    at org.apache.catalina.session.StandardSessionFacade.getAttribute(StandardSessionFacade.java:166)
    at com....// обфускатором идет SessionProcessor#sessionDestroyed

Автор: ivg 29.4.2009, 15:04
Цитата(integral @  29.4.2009,  16:56 Найти цитируемый пост)
стек-трейс:

Эти строки то как раз не интересны; что ниже?
Цитата(integral @  29.4.2009,  16:56 Найти цитируемый пост)
ну 2003 но с того времени, я полагаю, принцып работы не должен был изменится):

Не факт, тем более это не официальная информация. Судя по исходнику org.apache.catalina.session.StandardSession в момент вызова sessionDestroyed() сессия должна быть валидной.

Добавлено через 2 минуты и 19 секунд
Какая версия томката кстати?

Автор: integral 29.4.2009, 15:18
на этом воспроизводится:
Server Information
Tomcat Version    JVM Version    JVM Vendor    OS Name    OS Version    OS Architecture
Apache Tomcat/5.0.9    1.6.0_11-b03    Sun Microsystems Inc.    Windows XP    5.1    x86


а дальше идет вот такое:
       
Код

        at org.apache.catalina.session.StandardSession.expire(StandardSession.java:683)
    at org.apache.catalina.session.StandardSession.expire(StandardSession.java:641)
    at org.apache.catalina.session.StandardManager.processExpires(StandardManager.java:819)
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:4363)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1660)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1669)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1669)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1649)
    at java.lang.Thread.run(Thread.java:619)

Автор: ivg 29.4.2009, 15:42
Цитата(integral @  29.4.2009,  14:46 Найти цитируемый пост)
у меня томкет 6

Цитата(integral @  29.4.2009,  17:18 Найти цитируемый пост)
Apache Tomcat/5.0.9 

Ы? smile
Короче надо обновлять версию томката.

Автор: integral 29.4.2009, 15:56
Цитата(ivg @  29.4.2009,  15:42 Найти цитируемый пост)
Ы? 

на 5,0,9 проявляется, на 6,0,18 - нету = в том предложении ошибка была

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)