如何在Grails或Java Application中轻松实现“谁在线”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (10)

我正在构建一个grails的社区网站(使用Apache Shiro进行安全和身份验证系统),我想实现“谁在线?”这一功能。

这个网址http://cksource.com/forums/viewonline.php(如果您没有访问此网址,请参阅下面的快照)举例说明了我想要实现的目标。

我怎么能以最简单的方式做到这一点?Grails或Java中是否存在任何现有解决方案?

谢谢。

快照:Who的快照在线页面http://www.freeimagehosting.net/uploads/th.2de8468a86.png或在此处查看:http//www.freeimagehosting.net/image.php?2de8468a86.png

提问于
用户回答回答于

您需要Set<User>应用程序范围内收集a 中的所有登录用户。只要勾上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!

}

扫码关注云+社区

领取腾讯云代金券