2010-07-17 1 views
8

Ich baue eine Community-Website in Grails (mit Apache Shiro für Sicherheit und Authentifizierungssystem) und möchte das Feature "Wer ist online?" Implementieren.Wie kann man einfach "wer ist online" in Grails oder Java-Anwendung implementieren?

Diese URL http://cksource.com/forums/viewonline.php (siehe Snapshot unten, wenn Sie keinen Zugriff auf diese URL haben) gibt ein Beispiel, was ich erreichen möchte.

Wie kann ich das auf die einfachste Art und Weise tun? Gibt es eine bestehende Lösung in Grails oder in Java?

Vielen Dank.

Snapshot: Snapshot of Who is online page http://www.freeimagehosting.net/uploads/th.2de8468a86.png oder sehen hier: http://www.freeimagehosting.net/image.php?2de8468a86.png

+0

Diese URL erfordert eine Anmeldung, so ist es nutzlos für alle, die nicht oder nicht registrieren auf dieser Website ist. – BalusC

+0

@BalusC Frage aktualisiert – fabien7474

Antwort

21

Sie müssen alle angemeldeten Benutzer in einem Set<User> in der Anwendung Umfang sammeln. Einfach anhängen login und logout und hinzufügen und entfernen Sie die User entsprechend. Grundsätzlich gilt:

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); 
} 

Wenn Sie die angemeldeten Benutzer in der Sitzung sind zu speichern, dann möchten Sie einen weiteren Haken auf Sitzung hinzufügen zerstören eine Abmeldung auf jedem angemeldeten Benutzer zu erteilen. Ich bin mir nicht sicher, wie Grails in das Bild passt, aber in der Java Servlet API zu sprechen, möchten Sie HttpSessionListener#sessionDestroyed() dafür verwenden.

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); 
    } 
} 

können Sie auch lassen Sie einfach die User Modell HttpSessionBindingListener implementieren. Die implementierten Methoden werden automatisch aufgerufen, wenn die User Instanz in die Sitzung eingefügt oder aus ihr entfernt wird (was auch bei der Session-Zerstörung passieren würde).

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

Vielleicht fügen Sie auch eine Lease hinzu und aktualisieren sie bei Benutzeraktionen, um inaktive Sitzungen ohne ordnungsgemäße Abmeldung herauszufiltern. –

+0

Was passiert, wenn Benutzer sich nicht explizit abmelden, sondern nur ihren Browser schließen? –

+0

@Partly und @Burt: nur auf servletcontainer-gesteuerte Sitzung zu vernichten zerstören wie im letzten Absatz beschrieben ist ausreichend. – BalusC

Verwandte Themen