Существует множество возможностей того, что может пойти не так.
- Может быть два разных сеанса.
- Возможно, какой-то код удаляет ваш объект конфигурации из сеанса.
- Другие?
Вот способ, которым вы можете проверить, чтобы увидеть, что именно происходит.
Существует два отдельных интерфейса слушателя, которые вы можете реализовать для прослушиванияконкретные события сеанса: javax.servlet.http.HttpSessionListener и javax.servlet.http.HttpSessionAttributeListener
Я бы реализовал эти два интерфейса с помощью класса, который будет регистрировать, чтопроисходит во время каждого события и из какого сеанса происходит событие.
Вы должны иметь возможность легко добавлять своих слушателей в файл web.xml, чтобы tomcat фактически установил их в качестве слушателей ваших сеансов.
РЕДАКТИРОВАТЬ
Вот класс, который вы можете поместить в ваш web.xml как слушатель ваших сессий.И BalusC, и я рекомендовали вам попробовать этот подход для устранения проблемы.Пожалуйста, просто пошутите над нами и дайте нам знать, если вы видите что-нибудь интересное в способе установки вашего атрибута «конфигурации»?
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener, HttpSessionBindingListener, HttpSessionActivationListener {
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("valueBound: " + event.getName() + " : " + event.getValue());
System.out.println(" session: " + event.getSession().getId());
this.printStackTrace();
}
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("valueUnbound: " + event.getName() + " : " + event.getValue());
System.out.println(" session: " + event.getSession().getId());
this.printStackTrace();
}
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("attributeAdded: " + event.getName() + " : " + event.getValue());
System.out.println(" session: " + event.getSession().getId());
this.printStackTrace();
}
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("attributeRemoved: " + event.getName() + " : " + event.getValue());
System.out.println(" session: " + event.getSession().getId());
this.printStackTrace();
}
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("attributeReplaced: " + event.getName() + " : " + event.getValue());
System.out.println(" session: " + event.getSession().getId());
this.printStackTrace();
}
public void sessionCreated(HttpSessionEvent event) {
System.out.println("sessionCreated: " + event.getSession().getId());
this.printStackTrace();
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("sessionDestroyed: " + event.getSession().getId());
this.printStackTrace();
}
public void sessionDidActivate(HttpSessionEvent event) {
System.out.println("sessionDidActivate: " + event.getSession().getId());
this.printStackTrace();
}
@Override
public void sessionWillPassivate(HttpSessionEvent event) {
System.out.println("sessionWillPassivate: " + event.getSession().getId());
this.printStackTrace();
}
private void printStackTrace() {
try {
if (true) {
throw new Exception();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Пожалуйста, добавьте приведенный выше класс в свой код, а затем добавьте следующее в свою сеть.XML-файл между вашими сопоставлениями фильтров и сопоставлениями сервлетов:
<listener>
<listener-class><your.package.name>SessionListener</listener-class>
</listener>