1

我在 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
4

2 回答 2

2

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

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

这在手册的命名空间一章和会话管理一章中都有介绍。

于 2013-08-04T15:43:58.620 回答
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 容器,因此您需要在您的环境中对其进行测试

于 2013-08-02T05:23:14.700 回答