有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring 4会话管理

大家好

我目前正在公司内部运行一个部署在tomcat 8服务器上的企业级spring web应用程序

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

这就是为什么:

我的会话配置设置如下:

<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"/> 

会话超时设置为4小时:

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

现在,在最坏的情况下,有5个会话只在服务器端存储csrf令牌,假设平均寿命为3小时,阻止用户再次连接

请告诉我有比以下更好的解决方案:

max-sessions="biggerNumber" 

谢谢你的阅读


共 (1) 个答案

  1. # 1 楼答案

    您可以将两种可能性结合起来:

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

    但你还有一个更激进的方法:改变策略,不要拒绝新的连接,而是撤销最旧的连接。spring security允许它开箱即用,只需从concurrency-control标记中删除error-if-maximum-exceeded="true"

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