Как легко реализовать, “кто онлайн” в Grails или JAVA-приложении?

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

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

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

Спасибо.

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

8
задан fabien7474 17 July 2010 в 16:10
поделиться

2 ответа

Вам необходимо собрать всех вошедших в систему пользователей в Set в области приложения . Просто подключите вход и выход и добавьте и удалите пользователя соответственно. В основном:

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!

}
21
ответ дан 5 December 2019 в 07:10
поделиться

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

2
ответ дан 5 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: