我有一个使用 JSF1.2 + Richfaces 3.3.3 Final、MyFaces 1.2.7、Spring + Hibernate 的应用程序,每次清除浏览器的缓存和 cookie 并再次登录我的应用程序时,都会出现以下异常。
javax.faces.application.ViewExpiredException - /app/project/index.jsf
No saved view state could be found for the view identifier: /app/project/index.jsf
有人可以告诉我如何解决上述异常吗?
最佳答案
您可以通过将状态保存方法设置为客户端
而不是服务器
来解决此问题,以便将 View 存储(当然以序列化形式)在隐藏的输入字段中POST 形式的,而不是在服务器端的 session 中(这又被 JSESSIONID
cookie 引用;所以当你删除 session cookie 或者当 session 被删除时,所有 View 基本上都会丢失过期)。您可以通过将以下上下文参数添加到 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>
这并不能解决异常,但它至少为您提供了在错误页面中告诉最终用户有关问题以及最终用户必须采取哪些操作的机会。您甚至可以让错误页面指向登录页面,并有条件地呈现一些有关最终用户为何再次面对登录页面的消息。
另请参阅:
关于jsf - 如何解决 JSF 1.2 中的 ViewExpiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8315617/