我们最近将一个主要平台从jsf 1.2升级到2.0。升级后,我们每小时得到几个ViewExpiredException错误。从阅读的主题,似乎这是一个预期的异常,当会话过期,然而,我们已经审查了访问日志,我们得到这些异常,即使在某些情况下,请求只有5分钟的间隔。
我的问题如下:
1)除了会话过期,还有哪些情况可能导致ViewExpiredException?
2)我们记录的异常不包含导致异常的确切条件的太多细节(会话丢失,会话损坏,无法恢复特定组件)。是否有一种方法可以引入额外的日志记录来找出在每种情况下触发此异常的非常具体的情况?
银鲈2.0.4-b09Tomcat 6使用Memcached Session Manager进行会话复制
任何帮助都是感激的。谢谢!
除了会话过期,还有哪些情况可能导致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表单进行页面到页面的导航。