【问题标题】:Why are my sessions getting blown away upon app redeployment in Tomcat 7?为什么在 Tomcat 7 中重新部署应用程序时我的会话会被吹走?
【发布时间】:2015-01-21 02:55:44
【问题描述】:

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

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

【问题讨论】:

  • 解决此问题的另一个标准解决方案是将会话存储在数据库中,另请参阅clustering
  • 看看Spring Session。它不需要 Spring(尽管它与 Spring 有很好的集成),并且将您的会话存储外部化以消除容器的异想天开。
  • 谢谢。 Spring Session 似乎值得仔细研究...我有机会玩它时会报告。

标签: java session tomcat tomcat7


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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


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

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

    【讨论】:

      猜你喜欢
      • 2019-10-27
      • 2011-05-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多