如何设置视图超时时间?

10
在我们的JSF2项目中,使用JBoss 7.1.1,在web.xml中定义会话超时,它能够很好地工作。然而,有时我们会遇到视图过期的情况,即使会话仍然存在,也会导致类似于此错误的错误信息:
javax.faces.application.ViewExpiredException: viewId:/... - View /... could 
not be restored.

我们在哪里可以像对会话一样设置视图超时?或者视图到期是由其他原因引起的吗?

1个回答

15
另一个导致 ViewExpiredException 的原因是在会话中创建了太多的逻辑视图。默认限制取决于 JSF 实现,每个特定视图的同步 GET 请求基本上都会创建一个新视图。例如,当您使用 Mojarra(其默认限制为15)启动浏览器会话并在16个不同的选项卡中打开相同的视图,然后在第一个选项卡中提交表单,则您也可能遇到此异常。该限制可由 JSF 实现特定的上下文参数进行配置,Mojarra 中为 com.sun.faces.numberOfLogicalViews,而在 MyFaces 中为 org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION(默认值为20)。
然而,这是一个非常罕见的真实世界问题。如果您的 Web 应用程序确实是设计成以这种方式使用的(例如社交 / 社区网站,邀请在多个选项卡中打开,例如讨论论坛或问答),那么您可以考虑改用客户端状态保存。
另请参见: - javax.faces.application.ViewExpiredException: View could not be restored - com.sun.faces.numberOfViewsInSession vs com.sun.faces.numberOfLogicalViews

嗯,看起来不错,谢谢。但是,无论如何,是否有视图过期超时时间,如果有,它的寿命如何定义? - Xavier Portebois
3
除了会话超时,没有其他超时时间限制。然而,您可以设置“最大视图”选项,以提高此限制。当您通过GET请求第一次请求视图时,将创建一个视图,并在您进行回发但未导航到其他视图(例如ajax回发和返回null/void操作)期间保持活动状态。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接