Я создаю общественный веб-сайт в чашах Грааля (использующий 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
Вам необходимо собрать всех вошедших в систему пользователей в 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!
}
Это обсуждалось некоторое время назад в списке рассылки: http://grails.1312388.n4.nabble.com/Information-about-all-logged-in-users -with-Acegi-or-SpringSecurity-in-Grails-td1372911.html