繁体   English   中英

春季4 - 会话管理

[英]Spring 4 - Session Management

帮助大家,

我目前在部署在tomcat 8服务器上的公司内运行企业Spring Web应用程序。

现在,一些用户报告有时他们无法连接,因为登录页面上显示登录错误。

好吧,这就是原因:

我的session-configuration设置如下:

<session-management>
    <concurrency-control max-sessions="5" 
        error-if-maximum-exceeded="true" expired-url="/login" 
        session-registry-alias="sessionRegistry"/>
</session-management>

<form-login login-processing-url="/login" 
    login-page="/login" 
    authentication-failure-url="/login_error" />

<logout logout-url="/logout" logout-success-url="/login" 
    invalidate-session="true"/> 

session-timeout设置为4小时:

<session-timeout>240</session-timeout> 
  • 当用户请求登录页面时,在服务器端存储带有csfr-token的会话。
  • 当用户注销时,他的会话无效并且他被重定向到登录页面作为新会话,csfr-token再次存储在服务器端。
  • 当用户已经有5个会话(不同的浏览器,设备,奇怪的客户端行为)并尝试登录第6次时 - 登录被拒绝,因为超出了会话最大值。

现在在最坏的情况下,有5个会话只有csrf-token存储在服务器端,让我们说平均值。 寿命为3小时,阻止用户再次连接。

请有人告诉我,有一个更好的解决方案:

max-sessions="biggerNumber" 

并感谢您阅读...

您有两种可以组合的可能性:

  • 增加并发会话数
  • 减少会话超时(30分钟已经很大)

但你也有一种更激进的方式:改变策略,以便不拒绝新连接,但撤销最旧的连接。 弹出安全性允许开箱即用,只需从concurrency-control标记中删除error-if-maximum-exceeded="true"

<session-management>
    <concurrency-control max-sessions="5" 
        expired-url="/login" 
        session-registry-alias="sessionRegistry"/>
</session-management>

我检查了下面的弹簧文档并进行了测试。

http://docs.spring.io/spring-security/site/docs/current/reference/html/session-mgmt.html#concurrent-sessions

事实证明,您必须在web.xml中添加它

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

注销时,此侦听器将删除连接到主体实例的会话。 否则,即使在注销后,会话仍然连接到主体实例。 这就是为什么你会继续得到错误“超过此委托人的XX的最大会话数”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM