2010-07-17 116 views
8

我正在grails中構建一個社區網站(使用Apache Shiro進行安全和身份驗證系統),我想實現「誰在線?」功能。如何在Grails或Java應用程序中輕鬆實現「誰在線」?

此網址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

+0

此URL需要登錄,所以它是無用的人誰是不能或不會在該網站上註冊。 – BalusC 2010-07-17 13:53:49

+0

@BalusC問題已更新 – fabien7474 2010-07-17 16:12:42

回答

21

你需要收集用戶的所有信息記錄在Set<User>應用範圍。只需掛上loginlogout並相應地添加和刪除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! 

} 
+0

也許還需要添加租約並在用戶操作時對其進行刷新,以便在沒有正確註銷的情況下過濾掉非活動會話。 – 2010-07-17 14:53:48

+0

如果用戶不明確註銷但只關閉瀏覽器會怎麼樣? – 2010-07-17 15:19:38

+0

@Partly和@Burt:只需在最後一段中描述的servletcontainer管理的會話銷燬就足夠了。 – BalusC 2010-07-17 16:01:09

相關問題