java grails grails-plugin shiro

¿Cómo implementar fácilmente "quién está en línea" en la aplicación Grails o Java?



grails-plugin shiro (2)

Esto se ha discutido hace algún tiempo en la lista de correo: http://grails.1312388.n4.nabble.com/Information-about-all-logged-in-users-with-Acegi-or-SpringSecurity-in-Grails- td1372911.html

Estoy construyendo un sitio web de la comunidad en Grails (usando Apache Shiro para el sistema de seguridad y autenticación) y me gustaría implementar la función "¿quién está en línea?".

Esta url http://cksource.com/forums/viewonline.php (ver instantánea a continuación si no tienes acceso a esta URL) da un ejemplo de lo que me gustaría lograr.

¿Cómo puedo hacer eso de la manera más simple? ¿Hay alguna solución existente en Grails o en Java?

Gracias.

Instantánea: instantánea de quién es la página en línea http://www.freeimagehosting.net/uploads/th.2de8468a86.png o vea aquí: http://www.freeimagehosting.net/image.php?2de8468a86.png


Debe recopilar todos los usuarios que hayan iniciado sesión en un Set<User> en el ámbito de la aplicación . Simplemente enganche el login de login y el logout y agregue y elimine el User consecuencia. Básicamente:

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

Si está almacenando a los usuarios que han iniciado sesión en la sesión, entonces desea agregar otro enganche en la sesión destruir para emitir un cierre de sesión en cualquier usuario que haya iniciado sesión. No estoy seguro de cómo Grails encaja en la imagen, pero hablando en Java Servlet API, le gustaría usar HttpSessionListener#sessionDestroyed() para esto.

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

También puede dejar que el modelo de User implemente HttpSessionBindingListener . Los métodos implementados se invocarán automágicamente siempre que la instancia del User se haya puesto en sesión o se haya eliminado de ella (lo que también ocurriría en la destrucción de la sesión).

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