我在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
答案 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)
如果使用此机制来检测会话超时,如果用户注销,则可能会错误地报告错误,然后在不关闭浏览器的情况下重新登录。这是因为当您使会话无效时,会话cookie不会被清除,即使用户已注销,也会重新提交。您可以在注销时显式删除JSESSIONID cookie,例如在注销处理程序中使用以下语法:
<http>
<logout delete-cookies="JSESSIONID" />
</http>
的web.xml
<listener>
<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>
不幸的是,这不能保证与每个servlet容器一起使用,因此您需要在您的环境中对其进行测试