2

我正在使用 Spring Security 3.1 来处理登录身份验证、会话超时和最大会话数。

此外,我仅在注销时删除 cookie。

<logout delete-cookies="JSESSIONID" logout-success-url='logout page' />

此外,我已将最大会话数设置为 1 以进行测试。当我在浏览器中打开我的网页时,它会将 jsession id 存储在 cookie 中,但是当我退出并重新打开浏览器时问题就开始了。此时我在浏览器中找不到任何 cookie,它们被删除,这就是为什么我没有被重定向到欢迎页面(登录后的页面)。

但是当我再次登录时,它会显示我正在打印的错误消息:-超出会话数。

这可能意味着会话在服务器端仍然有效,但它会从客户端的 cookie 中删除,因此我既看不到欢迎页面,也无法在登录页面上登录。

我还需要做什么才能使 cookie 保留在浏览器中直到会话超时?我已将会话超时设置为 10 天

4

1 回答 1

2

这是正常行为。JSESSIONID cookie 仅在浏览器会话的生命周期内有效,因此在您关闭浏览器时消失。这不是你可以改变的。

浏览器对会话的感知与服务器上会话的生命周期之间没有联系。除非您实际注销,否则服务器会话仍然存在,直到超时并被服务器删除(在您的情况下为 10 天)。在此之前,尝试再次登录将超过允许的会话数。

如果你想保持登录状态 10 天,你可能想看看使用 remember-me cookie 而不是标准的 servlet 容器会话。

除非您明确要求限制用户可以拥有的并发会话数,否则我会避免使用它,因为它只会给您带来问题。您实际上并没有为此显示您的配置,但实际上只有两个选项。用户可以再次登录并且前一个会话将被标记为已过期,或者尝试第二次登录将导致错误,直到前一个会话超时,或者用户注销以显式使其无效。该行为由error-if-maximum-exceeded 命名空间属性控制。

于 2012-11-21T14:58:43.740 回答