Spring параллельная сессия безопасности и проблема HttpSessionListener - PullRequest
2 голосов
/ 14 июня 2011

Я реализовал HttpSessionListener, и он работает нормально, за исключением случая, когда вошедший в систему пользователь одновременно регистрируется во второй раз. Spring правильно завершает первый сеанс, но событие destroySession никогда не вызывается, по крайней мере, мой слушатель никогда его не получает.

Моя весенняя защита выглядит следующим образом:

<session-management 
    session-fixation-protection="migrateSession" >

<concurrency-control 
    max-sessions="1"
    expired-url="/login_sessionexpired" />
</session-management>

Вышеприведенное выдает пользователя из первого сеанса, если он одновременно входит во второй раз, однако HttpSessionListener.sessionDestroyed никогда не вызывается.

HttpSessionListener.sessionDestroyed обычно вызывается для ручного выхода из системы и времени ожидания сеанса.

У меня есть «делегирующий прокси» для слушателя в web.xml: com.test.security.DelegatingHttpSessionEventListenerProxy

Этот слушатель делегирует Spring-bean-компонент, определенный в my-servlet.xml как:

<bean id="httpSessionEventListener"
    class="com.test.security.SimpleHttpSessionEventListenerImpl" />

Делегирующий слушатель кодируется как:

public class DelegatingHttpSessionEventListenerProxy implements
    HttpSessionListener {

/**
 * Delegates sessionCreated Event to the Spring-bean
 */
@Override
public void sessionCreated(HttpSessionEvent se) {
    ApplicationContext context = WebApplicationContextUtils
            .getWebApplicationContext(se.getSession().getServletContext());

    HttpSessionListener target = context.getBean(
            "httpSessionEventListener", HttpSessionListener.class);
    target.sessionCreated(se);
}

/**
 * Delegates sessionDestroyed Event to the Spring-bean
 */
@Override
public void sessionDestroyed(HttpSessionEvent se) {
    ApplicationContext context = WebApplicationContextUtils
            .getWebApplicationContext(se.getSession().getServletContext());

    HttpSessionListener target = context.getBean(
            "httpSessionEventListener", HttpSessionListener.class);
    target.sessionDestroyed(se);
}
}

Я использую spring-security-3.0.5, может кто-нибудь сказать, что мне не хватает? Спасибо.

...