我在Tomcat 7中有一个Web应用程序,它将会话中的用户信息保存为DTO对象。我还为我的项目启用了Spring安全性,如果用户没有会话,它会自动将用户重定向到登录页面。
如果我登录我的应用程序一次然后在Eclipse中重新启动Tomcat会发生什么事情,我的会话被刷新但cookie没有。
这意味着服务器重启后会话中没有UserDto,但浏览器仍然存在有效的JSESSIONID。因此,Spring安全仍然认为用户已经登录,而事实上他并非如此。
为什么会这样? (我通过在Firefox中查看页面信息来检查JSESSIONID cookie的类型,它说 - Expire: At end of session
。理想情况下,它应该在服务器重启时到期或不应该到期?)
编辑:虽然Firefox说Expire: At end of session
但是如果我关闭并重新启动Firefox,cookie仍然存在。
答案 0 :(得分:1)
cookie保存在浏览器中 - 当服务器重新启动时,但浏览器继续运行,它将保留在cookie上,并在下次请求时将其提供给服务器。
现在在服务器端,您有多个选项:您可以将tomcat的SessionManager配置为在磁盘上保留并在重新启动时读取内容 - 这是一个选项,也用于在集群中的多个tomcats之间分配会话:会话被序列化到磁盘,任何服务器都可以通过“仅”反序列化来继续会话。有一些隐含的成本(因为你经常需要序列化会话)
目前我不能给你更多具体的提示 - 但是如果你查一下并理解存储cookie的位置之间的区别,为什么它在服务器重启时不会改变,你必须要看会话管理器的tomcat文档,你希望能够解决这个问题。
答案 1 :(得分:1)
如果您在Web项目中使用了会话,Tomcat将自动生成JSESSIONID。
如果会话ID已更改,则JSESSIONID将更改为对应。因为
JSESSIONID表示WEB项目的seeion ID
它将在服务器停止时到期(默认情况下将在30分钟内到期),但cookie无法自动删除
JSESSIONID可以配置在tomcat的server.xml文件中。
答案 2 :(得分:1)
从Servlet 3.0
添加过期日期到Cookie,您可以将cookie-config
添加到web.xml
文件
<session-config>
<session-timeout>30</session-timeout>
<cookie-config>
<max-age>1800</max-age>
</cookie-config>
</session-config>
答案 3 :(得分:0)
当您成功登录时,SpringSecurity会在您的浏览器中存储cookie。
当浏览器发送请求时,SpringSecurity会检查cookie中的内容。如果SpringSecurity找到之前存储的值,则认为您已登录,因此SpringSecurity将不会重定向到登录页面。