Вы можете использовать реализацию HttpSessionListener и контекст сервлета. HttpSessionListener вызывается всякий раз, когда сеанс создается или уничтожается, где в качестве ServletContextListener вызывается при создании или уничтожении Контекста.
EDIT: HttpSessionBindingListener можно использовать в классе, экземпляры которого могут быть сохранены в сессии, например, как в вашем случае пользователь.
Когда экземпляр этого пользователя будет установлен как атрибут сеанса с помощью HttpSession.setAttribute(), тогда будет вызвано значениеBound(). Когда он удаляется либо HttpSession.removeAttribute(), либо недействительным сеанса, либо заменяется другим HttpSession.setAttribute(), тогда вызывается valueUnbound().
Пример:
public class User implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
addLoginUser(event);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
removeLoginUser(event);
}
private void removeLoginUser(HttpSessionBindingEvent event){
if (user != null) {
ServletContext context = event.getSession().getServletContext();
Set<User> logins = context.getAttribute("loginUsers");
logins.remove(this);
}
}
private void addLoginUser(HttpSessionBindingEvent event){
if (user != null) {
ServletContext context = event.getSession().getServletContext();
Set<User> logins = context.getAttribute("loginUsers");
logins.add(this);
}
}
}
//Use this listner for adding loginUsers when ServletContext is initialized.
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent event){
Set<User> logins = new HashSet<User>();
//add Initial login to ServletContext
event.getServletContext().setAttribute("loginUsers", logins);
}
public void contextDestroyed(ServletContextEvent event){}
}
Добавьте следующую конфигурацию в файле web.xml.
<listener>
<listener-class>
package.name.MySessionAttributeListener
</listener-class>
</listener>
<listener>
<listener-class>
package.name.MyServletContextListener
</listener-class>
</listener>
Надеюсь, что это поможет, спасибо.
забыл создать атрибут logins, но это тривиально. –
Спасибо, но вы поняли, что все, что я пытаюсь скопировать, это контекст приложения -> session> users :) – amitmah
@amitmah вы не использовали 'ServletContext context'? можете ли вы объяснить это более подробно – Youssef