Tomcat 会话 cookie 不会过期

Posted

技术标签:

【中文标题】Tomcat 会话 cookie 不会过期【英文标题】:Tomcat session cookie doesn't expire 【发布时间】:2013-06-13 03:06:20 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

一看到这个问题,我就在等待一个好的答案,我得到了一个:)。即使我有点怀疑,所以没有回答这个问题。但你的回答澄清了它 @Olaf 所以cookie不会被删除,因为它是由不知道服务器状态的浏览器持有的。但是服务器不应该拒绝这个cookie无效吗?为什么spring security不将请求重定向到登录页面? 即使我重新启动 Firefox,Btw cookie 也不会被删除。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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>

【讨论】:

以上是关于Tomcat 会话 cookie 不会过期的主要内容,如果未能解决你的问题,请参考以下文章

当会话 cookie 在 Laravel 中过期时重新加载站点

过期时间为“会话结束”的 cookie 啥时候过期?

Chrome 关闭后 Jsessionid cookie 不会过期

如何在 Symfony 中延长会话 cookie 的生命周期?

浏览器会话结束时 Cookie 过期

cookies不设置过期时间默认是永远不过期吗