5

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

我的问题如下:

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

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

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

任何帮助表示赞赏。谢谢!

4

1 回答 1

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 常见问题解答。


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

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


根据评论进行更新,在包含表单的缓存页面上按下浏览器后退按钮,然后提交表单,这确实也可能导致ViewExpiredException视图过期。这可以通过以下两种方式解决,最好是结合使用:

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

有关更多详细信息,请参阅此答案

于 2011-04-11T13:06:49.647 回答