我有一个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:commandButton
outcome = "somepage.jsf"
时,5s之后的点击会重定向到错误页面。
当我使用action
属性调用某个bean操作或将页面名称放在同一个按钮上时,我在服务器的日志中看到ViewExpiredException
,但没有重定向。< / p>
为什么会这样?以及如何在会话到期后无论哪个行动发生,一般都会重定向到另一个页面?
答案 0 :(得分:1)
行为不同,因为已发送异步(ajax)请求。 Ajax请求需要特殊的XML响应。有关ajax请求的例外情况需要由JavaScript中的jsf.ajax.addOnError
处理程序或自定义ExceptionHandler
处理。
默认情况下,客户端没有任何形式的有用反馈。只有在项目阶段设置为Development
的Mojarra中,您才会看到带有异常消息的简单JavaScript警报消息。但就是这样。 Production
阶段没有单一形式的反馈。
使用自定义ExceptionHandler
,您将能够模拟与同步请求中完全相同的反馈形式。您可以解析web.xml
以找到正确的错误页面位置,在其周围创建一个新的UIViewRoot
并强制JSF将ajax渲染设置为@all
。由于这毕竟是相当多的工作,JSF实用程序库OmniFaces在FullAjaxExceptionHandler
的风格框中提供了这样的异常处理程序。您可以找到展示页面here。