升级到 jsf2 后的 ViewExpiredException

Posted

技术标签:

【中文标题】升级到 jsf2 后的 ViewExpiredException【英文标题】:ViewExpiredException after upgrade to jsf2 【发布时间】:2011-08-03 01:29:05 【问题描述】:

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

我的问题如下:

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

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

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

感谢任何帮助。谢谢!

【问题讨论】:

这个问题是“真正的”视图过期问题,还是在会话被 memcached-session-manager 反序列化时发生?在后一种情况下,您介意在 groups.google.com/group/memcached-session-manager 的 msm 邮件列表中讨论这个问题吗? 顺便说一句,我刚刚推送了一个 msm + jsf2/mojarra 示例:github.com/magro/msm-sample-webapp/tree/jsf2-mojarra(还通过 FacesLRUMapRegistration 添加了 kryo 支持)。干杯! 没有。这只是一个带有 msm 的会话复制问题。感谢您的样品!如果我们仍然有问题,我们会检查并点击邮件列表。 【参考方案1】:

除了会话过期,还有哪些其他情况可能导致 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 记录会话属性修改可能会有所帮助。


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

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

更多详情,请参阅this answer。

【讨论】:

所以只要他们在单个浏览器窗口中使用该站点,视图就会上升到 15,然后从那时起驱逐最旧的视图?我想使用 16 次后退按钮点击会有效地创建相同的条件?从查看访问日志来看,这似乎不太可能——其中一些用户总共只能访问

以上是关于升级到 jsf2 后的 ViewExpiredException的主要内容,如果未能解决你的问题,请参考以下文章

升级到 JSF 2.3 后,@Inject 在 @FacesConverter 中不起作用

在 JBoss 5.1.1 上将 JSF 从 1.2 升级到 2.1

升级到 Xcode 12.5 后的 xcodebuild 问题

升级到 HTTPS 后的 CSS 错误

升级到 EF 4.1 后的 System.NullReferenceException

播放服务升级到 7.5 后的 Google 分析问题