Вам необходимо собрать всех зарегистрированных пользователей в Set<User>
в области действия . Просто подключите login
и logout
и добавьте и удалите User
соответственно. В основном:
public void login(User user) {
// Do your business thing and then
logins.add(user);
}
public void logout(User user) {
// Do your business thing and then
logins.remove(user);
}
Если вы сохраняете зарегистрированных пользователей в сеансе, то вы хотели бы добавить еще одну ловушку для уничтожения сеанса, чтобы выполнить выход для любого вошедшего в систему пользователя. Я не уверен в том, как Grails вписывается в картину, но, говоря в Java Servlet API, вы хотели бы использовать HttpSessionListener#sessionDestroyed()
для этого.
public void sessionDestroyed(HttpSessionEvent event) {
User user = (User) event.getSession().getAttribute("user");
if (user != null) {
Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
logins.remove(user);
}
}
Вы также можете просто позволить модели User
реализовать HttpSessionBindingListener
. Реализованные методы будут вызываться автоматически каждый раз, когда экземпляр User
помещается в сеанс или удаляется из него (что также происходит при уничтожении сеанса).
public class User implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
logins.add(this);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins");
logins.remove(this);
}
// @Override equals() and hashCode() as well!
}