【问题标题】:How to solve ViewExpiredException in JSF 1.2如何解决 JSF 1.2 中的 ViewExpiredException
【发布时间】:2012-01-09 01:54:15
【问题描述】:

我有一个使用 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

谁能告诉我如何解决上述异常?

【问题讨论】:

    标签: jsf viewexpiredexception


    【解决方案1】:

    您可以通过将状态保存方法设置为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>
    

    这并没有解决异常,但它至少让您有机会在错误页面中告诉最终用户问题以及最终用户必须采取的措施。您甚至可以让错误页面指向登录页面,并有条件地呈现一些关于最终用户为何再次面对登录页面的消息。

    另见:

    【讨论】:

    • 感谢 Balus 的回复,但我们已经在我们的应用程序中使用了它,但我们正在使用服务器 incase 客户端方法。那么如果我们将其更改为客户端方法,那会对我的应用程序造成任何损害吗? javax.faces.STATE_SAVING_METHODclient
    • 这不会对您的应用程序造成任何损害。只有带宽使用会增加一点(但如果您在服务器上打开 GZIP 压缩,则不会增加太多;如果您尚未将服务器配置为使用 GZIP 压缩,您甚至会赢得更多)。
    • 我也尝试过以下方法,但我的情况是,一旦引发异常,它不会重定向到 sessionExpired 页面,而是默认重定向到登录页面。 \n javax.faces.application.ViewExpiredException/errors/sessionexpired.jsf.
    • 那么您在web.xml 中有另一个&lt;error-page&gt;,它的全局性更高&lt;exception-type&gt; 优先于ServletException。您需要创建一个 Filter 来捕获 ServletException 并重新抛出其根本原因。另见stackoverflow.com/questions/3206922/…
    猜你喜欢
    • 2018-03-27
    • 2016-06-18
    • 2011-09-03
    • 2011-10-05
    • 2011-03-18
    • 2012-09-04
    • 2011-01-08
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多