Tomcat会话cookie不会过期

时间:2013-06-17 07:58:20

标签: java java-ee tomcat servlets

我在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仍然存在。

4 个答案:

答案 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将不会重定向到登录页面。