您需要收集应用程序范围内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!
}