如何在 JSF 2 中处理会话过期和 ViewExpiredException?

Posted

技术标签:

【中文标题】如何在 JSF 2 中处理会话过期和 ViewExpiredException?【英文标题】:How to handle session expiration and ViewExpiredException in JSF 2? 【发布时间】:2011-06-26 22:11:30 【问题描述】:

考虑以下情况。 在会话超时(过期)后,我正在单击 JSF 表单的提交按钮。 浏览器显示一些异常消息:

ViewExpiredException:无法恢复视图上下文

我想要做的是,在会话过期后自动重定向到网站的主页。这样做的机制是什么?任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

要在 HTTP 会话已过期且 JSF 视图状态保存方法设置为 server 时在页面上调用同步 POST 请求时处理异常,请将 <error-page> 添加到 web.xml捕获 JSF ViewExpiredException 并显示主页。

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/home.xhtml</location>
</error-page>

要同时处理异步 (ajax) 请求的异常,您需要实现自定义 ExceptionHandler,如 Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request 中所回答的那样

另见:

javax.faces.application.ViewExpiredException: View could not be restored

【讨论】:

谢谢@BalusC 我在 web.xml 文件中添加了这样的条目&lt;error-page&gt; &lt;exception-type&gt;javax.faces.application.ViewExpiredException&lt;/exception-type&gt; &lt;location&gt;/index.xhtml&lt;/location&gt; &lt;/error-page&gt;我仍然从 glassfish 服务器得到异常。 HTTP Status 500 - **type** Exception report **message** **description** The server encountered an internal error () that prevented it from fulfilling this request. **exception** javax.faces.application.ViewExpiredException: viewId:/home.xhtml - View /home.xhtml could not be restored 有什么建议吗? 否 @BalusC 我在 web.xml 文件中没有其他错误页面。我已将欢迎文件和错误页面都配置为相同。(index.xhtml)。那会是个问题吗?我应该将此作为一个单独的问题提出来发布有关此的更多信息吗? 您好 BalusC,有一个小问题。它应该是 /faces/home.xhtml。如果没有“/faces”,Web 容器将只加载 XHTML 文件并返回其源代码,完全绕过 JSF。至少这是 JBoss 7 中的行为。 @RajV:显然你的 webapp 有 FacesServlet 映射到 /faces/* 而不是 *.xhtml 出于某种原因。只需相应地更改它以摆脱丑陋的附加 /faces 路径。这个小配置问题与这里提出的具体问题完全无关。 在meta标签中使用content属性是一个常见问题的简单优雅的解决方案。

以上是关于如何在 JSF 2 中处理会话过期和 ViewExpiredException?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSF 2.0 中使会话无效?

JSF 2.0 在整个会话中从浏览器和以编程方式设置区域设置 [重复]

如何使用 spring-security 和 jQuery 处理过期会话?

会话过期后未调用 @PreDestroy

如何在 Spring MVC-Spring Security 应用程序中处理 GWT RPC 调用的会话过期异常

如何在 JSF 中使用会话实现多用户登录