我发现本文对于非ajax请求How to handle session expiration and ViewExpiredException in JSF 2?很有用
但是当我使用AJAX调用提交时无法使用此功能。

假设在primefaces对话框中,我正在使用AJAX发出发布请求,并且 session 已经超时。
我看到页面卡住了。

如何解决这种情况,以便在我使用AJAX进行发布时,可以将他重定向到我的 View 过期页面,并
然后将他转发到类似于上面链接中的解决方案的登录页面?

JSF2 / Primefaces /玻璃鱼

最佳答案

默认情况下,ajax请求期间引发的异常在客户端完全没有反馈。仅当在项目阶段设置为Development的情况下运行Mojarra并使用<f:ajax>时,您才会获得带有异常类型和消息的纯JavaScript警报。但是除此之外,在PrimeFaces中,默认情况下根本没有反馈。但是,您可以在服务器日志和ajax响应中(在Webbrowser的开发人员工具集的“网络”部分中)看到异常。
您需要实现一个自定义的 ExceptionHandler ,当队列中有ViewExpiredException时,它基本上可以完成以下工作:

String errorPageLocation = "/WEB-INF/errorpages/expired.xhtml";
context.setViewRoot(context.getApplication().getViewHandler().createView(context, errorPageLocation));
context.getPartialViewContext().setRenderAll(true);
context.renderResponse();
另外,您可以使用JSF实用程序库OmniFaces。为此,它有一个 FullAjaxExceptionHandler (源代码here,演示here演示)。
也可以看看:
  • Why use a JSF ExceptionHandlerFactory instead of <error-page> redirection?
  • What is the correct way to deal with JSF 2.0 exceptions for AJAXified components?
  • 10-07 12:56
    查看更多