我正在运行Tomcat 7.0.54版的标准版本。每次我重新部署我的应用程序时,所有会话都会被清除;虽然,有趣的是,重新启动Tomcat 不会导致会话被清除。
我的应用程序是使用Scala编写的,基于Scalatra framework,但我确信这与问题无关。
答案 0 :(得分:1)
显然(并且荒谬地)Tomcat会在重新部署时清除默认持久会话文件所在目录的内容。要解决此问题,请在Tomcat通常的操场之外指定此文件的自定义位置。
在Tomcat的context.xml
文件中,类似于以下内容的行应该可以解决问题:
<Manager pathname="/some/path/persisted-sessions.ser" />
(感谢this thread指出了解决方案。我花了很多时间来讨论这个问题,所以想通过将它添加到StackOverflow来使解决方案更具发现性。)
免责声明:应该注意SlipperySeal的评论:“新部署可能会在会话和应用之间引入不兼容性。”
换句话说,你必须对此有点小心,如果你对应用程序在会话中存储内容的内容/方式/位置做了任何更改,你必须手动删除持久化会话文件部署更新的应用程序。
答案 1 :(得分:1)
部署工件的会话信息紧密耦合。
新部署可能会在会话和应用之间引入不兼容性。序列化对象可能不兼容,会话中值的“含义”也可能随着新版本的代码而改变。
重新启动服务器而不重新部署应用程序不会导致此问题,因为会话和部署将保持同步。
如果会话未被清除,您的用户可能会看到意外错误,或者更糟糕的是,应用程序可能表现不正确,从而允许他们获得更高的权限或造成其他损害。
如Chris所述,您可以将会话存储在Tomcats删除范围之外,但您可能需要考虑我所说的有关更改的内容。如果你知道模型已经以这种方式改变了,也许你自己删除会话。如果没有,显然会留下它们。