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

时间:2015-01-21 02:55:44

标签: java session tomcat tomcat7

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

(感谢this thread指出了解决方案。我花了很多时间来讨论这个问题,所以想通过将它添加到StackOverflow来使解决方案更具发现性。)


免责声明:应该注意SlipperySeal的评论:“新部署可能会在会话和应用之间引入不兼容性。”

换句话说,你必须对此有点小心,如果你对应用程序在会话中存储内容的内容/方式/位置做了任何更改,你必须手动删除持久化会话文件部署更新的应用程序。

答案 1 :(得分:1)

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

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

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

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

如Chris所述,您可以将会话存储在Tomcats删除范围之外,但您可能需要考虑我所说的有关更改的内容。如果你知道模型已经以这种方式改变了,也许你自己删除会话。如果没有,显然会留下它们。

相关问题