Вы должны собрать все зарегистрированные пользователь в 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!
}
Этот URL требует логин, так что это бесполезно для тех, кто не хочет или не зарегистрирует на этом сайте. – BalusC
@BalusC Вопрос обновлен – fabien7474