为什么我的会话在 Tomcat 7 中重新部署应用程序时会消失?

Why are my sessions getting blown away upon app redeployment in Tomcat 7?

我是 运行 Tomcat 的标准版本,版本 7.0.54。每次我重新部署我的应用程序时,所有会话都会被清除;尽管有趣的是,重新启动 Tomcat 不会 导致会话被清除。

我的应用程序是用 Scala 编写的并基于 Scalatra framework,但我相当确定这与问题无关。

显然(荒谬地)Tomcat 在重新部署时清除了默认持久会话文件所在目录的内容。要解决此问题,请为此文件指定一个自定义位置,在 Tomcat 的常用游乐场之外。

在 Tomcat 的 context.xml 文件中类似于以下的一行应该可以解决问题:

<Manager pathname="/some/path/persisted-sessions.ser" />

(感谢 this thread 指出解决方案。我花了很多时间来解决这个问题,所以想通过将其添加到 Whosebug 来使解决方案更容易被发现。)


免责声明:请注意SlipperySeal的评论:"A new deployment could introduce incompatibilities between the session and the app."

换句话说,你必须小心一点,如果你对 what/how/where 你的应用程序在会话中存储的东西进行了任何更改,你将不得不手动删除持久会话在部署更新后的应用程序时提交文件。

部署工件的会话信息紧密耦合。

新部署可能会在会话和应用程序之间引入不兼容性。序列化对象可能不兼容,并且会话中的 "meaning" 值也可能随着新版本的代码而改变。

重新启动服务器而不重新部署应用程序不会导致此问题,因为会话和部署将保持同步。

如果会话未被清除,您的用户可能会看到意外错误,或者更糟的是,应用程序可能会出现错误,从而允许他们获得更高的权限或造成其他损害。

正如 Chris 所提到的,您可以将会话存储在 Tomcat 删除范围之外,但您可能需要考虑我所说的有关重大更改的内容。如果您知道模型以这种方式发生了变化,也许您可​​以自己删除这些会话。如果没有,显然让他们去。