Spring安全性会遇到“超出此主体的最大会话数为1”。

时间:2013-08-02 04:52:49

标签: java spring-security

我在spring security中使用会话管理来限制每个用户名的并发用户数。

虽然它完美有效,但在没有注销的情况下使用应用程序几分钟后,它会重定向到索引页面,并且不允许同一用户再次登录。要再次登录,我需要重新运行该应用程序。

  <session-management invalid-session-url="/index">
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
    </session-management> 
    <logout delete-cookies="JSESSIONID" />

将以下内容添加到web.xml后,它也会遇到以下错误

的web.xml

    <listener>
<listener-
     class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>

错误

SEVERE: Exception while loading the app : java.lang.IllegalStateException: 
ContainerBase.addChild: start: org.apache.catalina.LifecycleException: 
java.lang.IllegalArgumentException: java.lang.ClassNotFoundException: 
org.springframework.security.ui.session.HttpSessionEventPublisher

2 个答案:

答案 0 :(得分:2)

您使用的是错误的类名(来自过时的Spring Security版本)。您的web.xml应包含

<listener>
  <listener-class>
     org.springframework.security.web.session.HttpSessionEventPublisher
  </listener-class>
</listener>

本手册的the namespace chapter以及session management一章中介绍了这一点。

答案 1 :(得分:0)

根据documentation

如果使用此机制来检测会话超时,如果用户注销,则可能会错误地报告错误,然后在不关闭浏览器的情况下重新登录。这是因为当您使会话无效时,会话cookie不会被清除,即使用户已注销,也会重新提交。您可以在注销时显式删除JSESSIONID cookie,例如在注销处理程序中使用以下语法:

  <http>
    <logout delete-cookies="JSESSIONID" />
  </http>

的web.xml

<listener>
<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>

不幸的是,这不能保证与每个servlet容器一起使用,因此您需要在您的环境中对其进行测试