3

我在 Tomcat 7 中有一个 Web 应用程序,它将用户信息作为 DTO 对象保存在会话中。我还为我的项目启用了 Spring 安全性,如果用户没有会话,它会自动将用户重定向到登录页面。

如果我登录到我的应用程序一次,然后我在 Eclipse 中重新启动 Tomcat,那么会发生我的会话被刷新但 cookie 没有消失。

这意味着在服务器重新启动后,会话中没有 UserDto,但有效的 JSESSIONID 保留在浏览器中。因此,spring security 仍然认为用户已登录,而实际上他并未登录。

为什么会这样?(我已经通过在 Firefox 中查看页面信息来检查 JSESSIONID cookie 的类型,它说 - Expire: At end of session。因此,理想情况下它应该在服务器重新启动时过期,还是不应该?)

编辑:虽然 Firefox 说Expire: At end of session如果我关闭并重新启动 Firefox,cookie 仍然存在。

4

4 回答 4

2

Servlet 3.0将过期日期添加cookie-config到您可以添加到web.xml文件中的 cookie

<session-config>
    <session-timeout>30</session-timeout> 
    <cookie-config>
        <max-age>1800</max-age>
    </cookie-config>
</session-config>
于 2015-03-11T14:30:55.503 回答
1

cookie 保存在浏览器中 - 当服务器重新启动但浏览器继续运行时,它将保存 cookie 并在下一次请求时将其呈现给服务器。

现在在服务器端,您有多个选项:您可以配置 tomcat 的 SessionManager 以在磁盘上持久保存并在重新启动时读取内容 - 这也是用于在集群中的多个 tomcat 之间分配会话的选项:当会话被序列化时到磁盘,任何服务器都可以通过“只是”反序列化来继续会话。隐含一些成本(因为您经常需要序列化会话)

目前我无法为您提供比这更具体的提示 - 但是如果您查找并了解 cookie 存储位置之间的区别,为什么它在服务器重新启动时不会更改,并且您必须查找 tomcat 文档的会话管理器,你希望能设法弄明白。

于 2013-06-17T08:19:55.653 回答
1

如果您在 Web 项目中使用了会话,Tomcat 将自动生成一个 JSESSIONID。
如果会话 id 改变了,那么 JSESSIONID 将改变对应。因为JSESSIONID表示WEB项目的seesion ID。
服务器停止时会过期(默认30分钟内过期),但是cookie不能自动删除。
JSESSIONID 可以在 tomcat 的 server.xml 文件中配置。

于 2013-06-17T08:21:55.607 回答
0

当您成功登录时,SpringSecurity 会在您的浏览器中存储一个 cookie。

当浏览器发送请求时,SpringSecurity 会检查 cookie 中的内容。如果 SpringSecurity 找到它之前存储的值,它就认为你已经登录了,所以 SpringSecurity 不会重定向到登录页面。

于 2013-06-18T02:04:38.303 回答