我们最近将主要平台从jsf 1.2升级到了2.0。升级后,我们每小时都会收到几个ViewExpiredException错误。通过阅读有关该主题的内容,看来会话终止时这是一个预期的例外,但是我们已经查看了访问日志,即使在某些情况下请求之间只有5分钟的间隔,我们也会收到这些例外。
我的问题如下:
1)除了会话到期,还有哪些其他情况可能导致ViewExpiredException?
2)我们正在记录的异常未包含导致异常的确切条件的详细信息(丢失会话,损坏的会话,无法还原特定组件)。有没有一种方法可以引入额外的日志记录来找出在每种情况下都会触发此异常的非常特殊的情况?
Mojarra 2.0.4-b09 Tomcat 6使用Memcached会话管理器进行会话复制
任何帮助表示赞赏。谢谢!
除了会话到期以外,还有哪些其他情况可能导致ViewExpiredException?
最终用户在会话中请求/创建了太多视图,并且正在提交旧视图。每个会话的默认最大观看次数为15。换句话说,如果最终用户在同一会话中具有表单的页面上打开16个浏览器窗口/选项卡并提交给第一个,则用户可以获取ViewExpiredException。
ViewExpiredException
每个会话的最大观看次数可web.xml通过以下方式配置
web.xml
<context-param> <param-name>com.sun.faces.numberOfViewsInSession</param-name> <param-value>15</param-value> </context-param>
有关其他参数,另请参见Mojarra常见问题解答。
有没有一种方法可以引入额外的日志记录来找出在每种情况下都会触发此异常的非常特殊的情况?
不是通过JSF和/或ViewExpiredException。整个异常仅表示该视图不再存在于会话中。这反过来可能确实有更多的潜在原因。使用a记录会话的创建和销毁,HttpSessionListener以及记录会话属性的修改by HttpSessionAttributeListener可能会有所帮助。
HttpSessionListener
HttpSessionAttributeListener
*根据评论进行 *更新 ,在包含表单的缓存页面上按浏览器后退按钮,然后再提交表单,这实际上也可能导致ViewExpiredException视图过期。这可以通过以下两种方法来解决,最好是将它们结合使用: