我们最近将一个主要平台从 jsf 1.2 升级到了 2.0。升级后,我们每小时都会收到几个 ViewExpiredException 错误。通过阅读该主题,这似乎是 session 过期时的预期异常,但是我们已经审查了访问日志,即使在某些情况下请求仅相隔 5 分钟,我们也会收到这些异常。
我的问题如下:
1) 除了 session 过期,还有哪些情况可能导致 ViewExpiredException?
2) 我们正在记录的异常不包含有关导致异常的确切条件的详细信息(丢失 session 、损坏的 session 、无法恢复特定组件)。有没有办法引入额外的日志记录,以找出在每种情况下触发此异常的非常具体的情况?
Mojarra 2.0.4-b09 Tomcat 6 使用 Memcached session 管理器进行 session 复制
感谢任何帮助。谢谢!
最佳答案
Other than session expiration, what other conditions might cause ViewExpiredException?
最终用户在一个 session 中请求/创建了过多的 View ,并且正在提交旧 View 。每个 session 的默认最大查看次数为 15。换句话说,如果最终用户在同一个 session 中使用表单在页面上打开 16 个浏览器窗口/选项卡并提交到第一个,则用户可以获得 ViewExpiredException
.
每个 session 的最大观看次数可通过
在web.xml
中配置
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>15</param-value>
</context-param>
另见 Mojarra FAQ对于其他参数。
Is there a way to introduce additional logging to find out the very specific situation that is triggering this exception in each case?
不是通过 JSF 和/或 ViewExpiredException
。整个异常只是意味着该 View 不再出现在 session 中。这反过来确实有更多的潜在原因。使用 HttpSessionListener
记录 session 创建和销毁并通过 HttpSessionAttributeListener
记录 session 属性修改可能会有帮助。
更新 根据评论,在包含表单的缓存页面上按浏览器后退按钮然后提交表单确实也可能导致 ViewExpiredException
当 View 是已过期。这可以通过以下两种方式解决,最好结合使用:
- 指示浏览器不缓存页面。
- 不要不使用 POST 表单进行普通的页面到页面导航。
有关详细信息,请参阅 this answer .
关于jsf - 升级到 jsf2 后出现 ViewExpiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5621674/