1

我有一个 JSF 2 应用程序并配置了以下内容web.xml

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

@SessionScoped出于测试目的,我在一个带有注释的 init 方法中的类中有以下代码,@PostConstruct以便让会话快速过期:

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) ec.getSession(false);
session.setMaxInactiveInterval(5);

现在,当我有一个h:commandButtonwithoutcome = "somepage.jsf"然后在 5s 之后单击将重定向到错误页面。

当我改为调用一些 bean 操作或使用属性将页面名称放在同一个按钮上时action,我会ViewExpiredException在服务器日志中看到 ,但不会发生重定向。

为什么呢?以及在会话过期后发生的任何操作,通常如何重定向到另一个页面?

4

1 回答 1

1

行为不同,因为发送了异步 (ajax) 请求。Ajax 请求需要特殊的 XML 响应。ajax 请求的异常需要由jsf.ajax.addOnErrorJavaScript 中的处理程序或自定义的ExceptionHandler.

默认情况下,他们在客户端没有单一形式的有用反馈。只有在项目阶段设置为的 Mojarra 中,Development您才会看到带有异常消息的纯 JavaScript 警报消息。但就是这样。阶段没有单一形式的反馈Production

使用自定义ExceptionHandler,您将能够模拟与同步请求中完全相同的反馈形式。您可以解析web.xml以找到正确的错误页面位置,UIViewRoot围绕它创建一个新的并强制 JSF 将 ajax 渲染设置为@all. 因为这毕竟是相当多的工作,所以 JSF 实用程序库OmniFacesFullAjaxExceptionHandler. 您可以在此处找到展示页面。

于 2012-11-20T01:46:08.670 回答