在JBoss 7.1.1上的JSF2项目中,我们在web.xml
中定义了会话超时,它运行得很好。
然而,有时我们会遇到视图过期,即使会话仍然有效,也会导致类似这样的错误:
javax.faces.application.ViewExpiredException: viewId:/... - View /... could
not be restored.
我们在哪里可以设置视图超时,就像我们在会话中所做的那样?或者视图过期是由其他原因引起的?
ViewExpiredException
的另一个原因是在会话中创建了太多逻辑视图。默认限制是特定于JSF实现的,特定视图上的每个同步GET请求基本上都会创建一个新视图。因此,例如,当你使用Mojarra(默认限制为15),启动浏览器会话,在16个不同的选项卡中打开同一个视图,然后在第一个选项卡中提交表格时,你也可能会遇到这种例外。这个限制可以通过JSF实现特定的上下文参数来配置,Mojarra的上下文参数是com.sun.faces.numberOfLogicalViews
,MyFaces的上下文参数为org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION
(默认为20)。
然而,这是一个非常罕见的现实世界问题。如果你的网络应用程序真的被设计成这样使用(例如,一个社交/社区网站邀请在多个选项卡中打开,如讨论论坛或问答),那么你可能会考虑使用客户端状态保存。
另请参阅:
- javax.faces.application.ViewExpiredException:无法还原视图
- com.sun.faces.numberOfViewsInSession与com.sun.fances.numberOfLogicalViews