如何解决JSF 1.2中的ViewExpiredException
我有一个使用JSF1.2 + Richfaces 3.3.3 Final,MyFaces 1.2.7,Spring + Hibernate的应用程序,每当我清除浏览器的缓存和cookie并再次登录到我的应用程序时,我会得到下面的异常。
javax.faces.application.ViewExpiredException - /app/project/index.jsf
未能为视图标识符找到保存的视图状态:/app/project/index.jsf
任何人都可以让我知道如何解决上述异常?
您可以通过将状态保存方法设置为client
而不是server
来解决此问题,以便在POST表单的隐藏输入字段中存储视图(当然是以序列化的形式),而不是在服务器端的会话中(这是接着被JSESSIONID
cookie引用;所以当你删除会话cookie或会话过期时,所有视图基本上都会丢失)。 您可以通过将以下上下文参数添加到web.xml
来完成此操作:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
如果由于某种原因上述内容不是一个选项,那么最好能做的就是像web.xml
的错误页面那样轻轻地处理它,如下所示:
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/errors/sessionexpired.jsf</location>
</error-page>
这并不能解决例外情况,但它至少为您提供了在错误页面中告诉最终用户该问题以及最终用户需采取什么操作的机会。 您甚至可以让错误页面指向登录页面,并有条件地呈现关于终端用户为什么再次面对登录页面的消息。
也可以看看:
ViewExpiredException
标签维基页面