Получите все существующие сессионные компоненты от всех пользователей в Spring - PullRequest
1 голос
/ 04 мая 2010

Есть ли способ получить все существующие сессионные компоненты, управляемые Spring во время выполнения? Получить их для текущего пользователя легко.

Есть предложения?

Спасибо, XLR

Ответы [ 2 ]

1 голос
/ 04 мая 2010

Я не делаю Spring, но в обычном JSF / JSP / Servlet вы бы взяли HttpSessionBindingListener для этого. По сути, вам нужно присвоить сессионному компоненту свойства static List<Bean> и реализовать интерфейс соответствующим образом, чтобы он обновлял список static в методах valueBound() и valueUnbound().

Подробный пример кода можно найти в этом ответе .

0 голосов
/ 29 марта 2012

Вот решение, которое я придумал, использующее Spring:

Я делаю обычный синглтон-компонент Spring с именем SessionBeanHolder. Этот бин содержит список моих сессионных бинов. Когда пользователь входит в систему, я добавляю сессионный компонент в мой SessionBeanHolder.

Когда вы ссылаетесь на сессионные компоненты в Spring, вы на самом деле имеете в виду прокси. Поэтому ключевым моментом при выполнении этой работы было получение базового компонента для добавления в SessionBeanHolder.

Ниже приведен пример кода:

Примечание. Мой сессионный компонент называется SessionInfo.

@Scope(value="singleton")
@Component
public class SessionBeanHolder {

    static Set<SessionInfo> beans;

    public SessionBeanHolder() {
        beans = new HashSet<SessionInfo>();
    }

    public Collection<SessionInfo> getBeans() {
        return beans;
    }

    public void addBean(SessionInfo bean) {
        try {
            this.beans.add(removeProxyFromBean(bean));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Fetch the underlying bean that the proxy refers to
    private SessionInfo removeProxyFromBean(SessionInfo proxiedBean) {
        if (proxiedBean instanceof Advised) {
            try {
                return (SessionInfo) ((Advised) proxiedBean).getTargetSource().getTarget();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        } else {
            return proxiedBean;
        }
    }
}

Естественно, всякий раз, когда вы хотите добавить сессионный компонент или получить список всех компонентов, просто подключите SessionBeanHolder автоматически и используйте его методы.

    @Autowired
    SessionBeanHolder sessionBeanHolder;
...