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