9

grails でコミュニティ Web サイトを構築しており (セキュリティと認証システムに Apache Shiro を使用)、「誰がオンラインか?」機能を実装したいと考えています。

この URL http://cksource.com/forums/viewonline.php (この URL にアクセスできない場合は、以下のスナップショットを参照してください) は、私が達成したいことの例を示しています。

最も簡単な方法でそれを行うにはどうすればよいですか?Grails または Java に既存のソリューションはありますか?

ありがとうございました。

スナップショット:誰がオンライン ページ http://www.freeimagehosting.net/uploads/th.2de8468a86.png のスナップショットまたはこちらを参照してください: http://www.freeimagehosting.net/image.php?2de8468a86.png

4

2 に答える 2

23

アプリケーションスコープ内Set<User>のすべてのログイン ユーザーを収集する必要があります。と をフックして、それに応じて を追加および削除するだけです。基本的:loginlogoutUser

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!

}
于 2010-07-17T13:57:00.570 に答える
2

これはメーリング リストで以前に議論されました: http://grails.1312388.n4.nabble.com/Information-about-all-logged-in-users-with-Acegi-or-SpringSecurity-in-Grails- td1372911.html

于 2010-07-17T14:17:42.577 に答える