Spring安全性并发会话和HttpSessionListener问题

时间:2011-06-14 17:54:18

标签: spring spring-security httpsession

我已经实现了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     

此侦听器委托my-servlet.xml中定义的spring-bean为:

<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,有人可以告诉我我错过了什么吗? 谢谢。

0 个答案:

没有答案