アプリケーションスコープ内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!
}