【问题标题】:Preventing ViewExpiredException with JSF 2 after redeploy重新部署后使用 JSF 2 防止 ViewExpiredException
【发布时间】:2014-12-22 21:53:09
【问题描述】:

我有一个问题,每次我重新部署我的应用程序时,任何现有会话都会中断,并且请求会导致 ViewExpiredException。相关问题或外部邮件列表/论坛帖子中的建议似乎都无法解决此问题。我可以完全不改变地重新部署相同的 WAR 文件,并且行为是相同的。

我正在使用 Apache MyFaces 2.2.0、Tomcat 7.0.56 和 Primefaces 5.0。

异常的消息是No saved view state could be found for the view identifier:,其中包含将请求的任何页面。 Primefaces 的menubar 用于导航,它似乎被实现为带有POST 请求的<form>。这些消息同时出现在那些导航选项和使用 POST 的其他 AJAX 中。

我试过了:

  1. 设置显式org.apache.myfaces.SECRETorg.apache.myfaces.MAC_SECRET 值,如in this document 所示。
  2. javax.faces.STATE_SAVING_METHOD 参数的 clientserver 值。
  3. 确保所有 bean 及其传递字段都是可序列化的。日志中未报告序列化错误。
  4. 使用过滤器添加无缓存标头,例如正如this answer 中所建议的那样。
  5. 会话持久性未被禁用,即我的context.xml 已将<Manager pathname="" /> 注释掉。

【问题讨论】:

  • 你设置了 org.apache.myfaces.MAC_SECRET 参数了吗?存储在视图状态中的信息既加密又被篡改,每次重新启动应用程序时都会为两者生成一个新密钥。见Security configuration for Myfaces Core
  • 试过了,没用。我编辑了问题以反映这一点并提供更多信息。

标签: java jsf tomcat primefaces jsf-2.2


【解决方案1】:

似乎丢失会话是 Tomcat 的一个“功能”,至少从版本 6 开始,并且在通过 WAR 文件部署时继续到版本 7。我们必须复制一个解压目录以避免丢失会话,因为 WAR 更改会导致 undeploy 后跟 deploy,而不是 reload

bug report 声明:

有一些方法可以在不删除会话的情况下更新应用程序。最简单的大概是:
- 部署为展开目录而不是 WAR
- 更新文件
- 触摸 web.xml 以触发重新加载

当前行为的原因是为了防止当 WAR 以不兼容的方式更新时出现问题,并且除了完全取消部署然后(基本上)新部署之外的任何其他操作都会导致冲突。

current Tomcat 7.0 documentation 中仍然是这种情况:

目前,当直接从 WAR 文件部署 Web 应用程序时,不支持重新加载应用程序(以获取对类或 web.xml 文件的更改)。它仅在从解压缩目录部署 Web 应用程序时才有效。

【讨论】:

    【解决方案2】:

    尝试:

    <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"/>
    

    【讨论】:

    • 试过了,但没有任何区别。根据documentation,标准管理器已经有这种行为。
    • 仔细检查它是否也在tomcat/conf/Catalina/localhost/appname.xml中被注释掉(或显式);有时tomcat 会在重新部署时保留上下文文件。还要检查 tomcat 是否创建 tomcat/temp/sessions.ser${java.io.tmpdir}/sessions.ser 文件以及这些文件夹是否具有写入权限。
    • 如果我关闭 Tomcat,就会创建文件。事实上,会话在 Tomcat 重新启动后仍然可以正常运行。但是它们无法在重新部署后幸存下来,例如如果我只是touch myapp.war。也许不同之处在于我在后一种情况下看到“取消部署上下文”消息,但在我重新启动 Tomcat 时没有?
    猜你喜欢
    • 2011-01-08
    • 2015-10-30
    • 2011-03-18
    • 2012-02-20
    • 2011-10-05
    • 2016-01-13
    • 1970-01-01
    • 2021-08-13
    • 2019-08-11
    相关资源
    最近更新 更多