2010-07-17 2 views
8

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

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

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

спасибо.

Snapshot: Snapshot of Who is online page http://www.freeimagehosting.net/uploads/th.2de8468a86.png или посмотреть здесь: http://www.freeimagehosting.net/image.php?2de8468a86.png

+0

Этот URL требует логин, так что это бесполезно для тех, кто не хочет или не зарегистрирует на этом сайте. – BalusC

+0

@BalusC Вопрос обновлен – fabien7474

ответ

21

Вы должны собрать все зарегистрированные пользователь в 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! 

} 
+0

Возможно, также добавьте аренду и обновите его при действиях пользователя, чтобы отфильтровывать неактивные сеансы без надлежащего выхода из системы. –

+0

Что делать, если пользователи не выходят из системы явно, а просто закрывают браузер? –

+0

@Partly и @Burt: достаточно просто подключиться к сеансу, управляемому сервлетконтейнером, как описано в последнем абзаце. – BalusC

2

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

+0

Спасибо Стефан.Однако поток, который вы указываете, касается Spring Security, и, к сожалению, я использую Shiro. – fabien7474

+0

Привет, Фабиен, я не читал это достаточно внимательно - ссылка, которую я опубликовал, работает только для ачеги. –