Как легко реализовать «кто онлайн» в Grails или Java-приложении? - PullRequest
8 голосов
/ 17 июля 2010

Я строю веб-сайт сообщества Grails (используя Apache Shiro для системы безопасности и аутентификации), и я хотел бы реализовать функцию «кто в сети?».

Этот URL http://cksource.com/forums/viewonline.php (см. Снимок ниже, если у вас нет доступа к этому URL) дает пример того, чего я хотел бы достичь.

Как я могу это сделать?самым простым способом?Есть ли какое-либо существующее решение в Grails или в Java?

Спасибо.

Снимок: Снимок страницы Кто на сайте http://www.freeimagehosting.net/uploads/th.2de8468a86.png или см. Здесь: http://www.freeimagehosting.net/image.php?2de8468a86.png

Ответы [ 2 ]

21 голосов
/ 17 июля 2010

Вам необходимо собрать всех зарегистрированных пользователей в 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);
}

Если вы сохраняете зарегистрированных пользователей в сеансе, то вы хотели бы добавить еще одну ловушку для уничтожения сеанса, чтобы выполнить выход для любого вошедшего в систему пользователя. Я не уверен в том, как 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!

}
2 голосов
/ 17 июля 2010

Это обсуждалось некоторое время назад в списке рассылки: http://grails.1312388.n4.nabble.com/Information-about-all-logged-in-users-with-Acegi-or-SpringSecurity-in-Grails-td1372911.html

...