升级到jsf2后出现ViewExpiredException

时间:2011-04-11 13:00:01

标签: jsf tomcat viewexpiredexception mojarra

我们最近将主要平台从jsf 1.2升级到2.0。升级后,我们每小时都会收到几个ViewExpiredException错误。通过阅读该主题,似乎这是会话到期时的预期异常,但是我们已经审查了访问日志,即使请求在某些情况下仅相隔5分钟,我们也会收到这些异常。

我的问题如下:

1)除会话到期外,还有哪些其他条件可能导致ViewExpiredException?

2)我们正在记录的异常没有包含导致异常的确切条件的详细信息(缺少会话,损坏会话,无法恢复特定组件)。有没有办法引入额外的日志记录来找出在每种情况下触发此异常的非常具体的情况?

Mojarra 2.0.4-b09 雄猫6 使用Memcached会话管理器进行会话复制

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:5)

  

除会话过期外,还有哪些其他情况可能导致ViewExpiredException?

最终用户在会话中请求/创建了太多视图,并且正在提交旧视图。每个会话的默认最大视图数为15.换句话说,如果最终用户在同一会话中具有表单的页面上打开16个浏览器窗口/选项卡并提交给第一个,则用户可以获得ViewExpiredException

每个会话的最大观看次数可在web.xml

中配置
<context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>15</param-value>
</context-param>

有关其他参数,另请参阅Mojarra FAQ


  

有没有办法引入额外的日志记录来找出在每种情况下触发此异常的特定情况?

不是通过JSF和/或ViewExpiredException。整个异常只是意味着视图不再出现在会话中。这反过来确实会有更多根本原因。使用HttpSessionListener记录会话创建和销毁,并按HttpSessionAttributeListener记录会话属性修改可能会有所帮助。


根据评论

更新,按下包​​含表单的缓存页面上的浏览器后退按钮,然后在视图过期后提交表单确实也会导致ViewExpiredException。这可以通过以下两种方式解决,最好是它们的组合:

  • 指示浏览器缓存页面。
  • 使用POST表单进行纯页面到页面导航。

有关详细信息,请参阅this answer