我按照以下文章处理 ViewExpiredException -
在 JSF2 中优雅地处理 ViewExpiredException
它做它应该做的事情。但是,如果由于 ViewExpiredException 将用户重定向到它,我希望在视图中显示一些 FacesMessage。因此,我在使用 NH.handlenaviage() 进行重定向之前添加了 FacesMessage。但它不起作用,原因是 FacesMessage 只存活了一个请求处理周期。
起初我的解决方案是将消息保存在会话中并在下一个周期的恢复视图阶段之前检索它。
尽管它有效,但我开始寻找一些标准解决方案,我遇到的第一件事是以下文章 -
但它没有用。我认为这是因为 PhaseListeners 在 ExceptionHandlers 之前执行。所以,在这种情况下,它是没有用的。我认为如果异常处理代码在侦听器的 afterPhase 代码之前执行会很有用。
然后我遇到了以下线程 -
以下是我现在拥有的 -
@Override
public void handle() throws FacesException {
Iterator<ExceptionQueuedEvent> i = this.getUnhandledExceptionQueuedEvents().iterator();
while (i.hasNext()) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext eventContext = (ExceptionQueuedEventContext) event.getSource();
Throwable throwable = eventContext.getException();
if (throwable instanceof ViewExpiredException) {
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext().getFlash().setKeepMessages(true);
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Your session expired!", null));
NavigationHandler nv = facesContext.getApplication().getNavigationHandler();
try {
facesContext.getViewRoot().setViewId("/login");
nv.handleNavigation(facesContext, null, "/login?faces-redirect=true");
facesContext.renderResponse();
} finally {
i.remove();
}
}
}
this.getWrapped().handle();
}
它解决了这个问题,但仅适用于同一目录中的视图。
以下是我对 Flash 范围进行一些研究后得到的结果-
有人可以帮我解决这个问题吗?我正在寻找一些 JSF(如果不是标准的那么好)处理这个问题的方法。
谢谢你。