2016-07-15 2 views
1

Я использую spring-mvc и каждое использование, которые вошли в моем веб-приложение я создать переменную сеанса user, который является объект, содержащий его идентификатор, имя и некоторые другие данные.Как я могу получить список всех пользователей, зарегистрированных в моем веб-приложение

session.setAttribute("user", user); 

Что я хочу - это иметь список всех пользователей, которые вошли в мою программу.

Я хочу, чтобы этот список проверял одновременный вход в систему, потому что должен быть только один доступ по учетной записи.

пс: не говори мне использовать spring-security, потому что я хочу работать только с MVC Interceptor и preHandle()

ответ

0

1) использовать ниже код для автоматического проволочного объекта ServletContext весной MVC

@Autowired 
ServletContext context; 

2) Вам нужно собрать всех зарегистрированных пользователей. Установить в контексте.

... 
    public void login(User user) { 
     logins.add(user); 
    } 
...  
    public void logout(User user) { 
     logins.remove(user); 
    } 

Если вы храните аноним в сессии уже

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); 
    } 
} 
+0

забыл создать атрибут logins, но это тривиально. –

+0

Спасибо, но вы поняли, что все, что я пытаюсь скопировать, это контекст приложения -> session> users :) – amitmah

+0

@amitmah вы не использовали 'ServletContext context'? можете ли вы объяснить это более подробно – Youssef

0

Вы можете использовать реализацию HttpSessionListener и контекст сервлета. HttpSessionListener вызывается всякий раз, когда сеанс создается или уничтожается, где в качестве ServletContextListener вызывается при создании или уничтожении Контекста.

EDIT: HttpSessionBindingListener можно использовать в классе, экземпляры которого могут быть сохранены в сессии, например, как в вашем случае пользователь.

Когда экземпляр этого пользователя будет установлен как атрибут сеанса с помощью HttpSession.setAttribute(), тогда будет вызвано значениеBound(). Когда он удаляется либо HttpSession.removeAttribute(), либо недействительным сеанса, либо заменяется другим HttpSession.setAttribute(), тогда вызывается valueUnbound().

Пример:

public class User implements HttpSessionBindingListener { 

@Override 
public void valueBound(HttpSessionBindingEvent event) { 
    addLoginUser(event); 
} 

@Override 
public void valueUnbound(HttpSessionBindingEvent event) { 
    removeLoginUser(event); 
} 

private void removeLoginUser(HttpSessionBindingEvent event){ 
if (user != null) { 
      ServletContext context = event.getSession().getServletContext(); 
      Set<User> logins = context.getAttribute("loginUsers"); 
      logins.remove(this); 
    } 
} 
    private void addLoginUser(HttpSessionBindingEvent event){ 

    if (user != null) { 
     ServletContext context = event.getSession().getServletContext(); 
     Set<User> logins = context.getAttribute("loginUsers"); 
     logins.add(this); 
    } 
} 

}

//Use this listner for adding loginUsers when ServletContext is initialized. 
public class MyServletContextListener implements ServletContextListener{ 
    public void contextInitialized(ServletContextEvent event){ 
     Set<User> logins = new HashSet<User>(); 

     //add Initial login to ServletContext 
     event.getServletContext().setAttribute("loginUsers", logins); 
    } 

public void contextDestroyed(ServletContextEvent event){} 

} 

Добавьте следующую конфигурацию в файле web.xml.

<listener> 
    <listener-class> 
     package.name.MySessionAttributeListener 
    </listener-class> 
</listener> 

<listener> 
    <listener-class> 
     package.name.MyServletContextListener 
    </listener-class> 
</listener> 

Надеюсь, что это поможет, спасибо.

+0

, но пользователь создан после создания сеанса! в вашем случае он никогда не будет добавлен в коллекцию – Youssef

+0

Лучшим подходом будет ваш случай, вы можете прикрепить HttpSessionBindingListener –

Смежные вопросы