代码之家  ›  专栏  ›  技术社区  ›  fabien7474 Jan Tchärmän

如何在GRASES或Java应用程序中轻松实现“谁是联机”?

  •  8
  • fabien7474 Jan Tchärmän  · 技术社区  · 14 年前

    我正在Grails中构建一个社区网站(使用ApacheShiro作为安全和认证系统),我想实现“谁在线?”.

    这个网址 http://cksource.com/forums/viewonline.php (如果您没有访问此URL的权限,请参阅下面的快照)给出了一个我希望实现的示例。

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

    谢谢您。

    快照: Snapshot of Who is online page http://www.freeimagehosting.net/uploads/th.2de8468a86.png 或者在这里看到: http://www.freeimagehosting.net/image.php?2de8468a86.png

    2 回复  |  直到 11 年前
        1
  •  21
  •   BalusC    11 年前

    您需要在 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);
    }
    

    如果您要在会话中存储已登录的用户,那么您需要添加另一个hook-on会话销毁,以便在任何已登录的用户上发出注销。我不确定GRAIUS是如何匹配的,但是在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);
        }
    }
    

    你也可以让 用户 模型实现 HttpSessionBindingListener . 每当 用户 实例已放入会话或从中删除(会话销毁时也会发生这种情况)。

    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!
    
    }