viewExpiredexception
`viewExpiredexceptionviewExpiredexceptionがスローされた場合、例外がスローされたページにリダイレクトすることを想定したカスタムviewExpiredexceptionハンドラーを作成し、で使用されるセッションにブール値を挿入する場所をキャッシュして処理しようとしています。 「ページが更新されました」というメッセージを表示するために拒否されたページ。
以下は、私のViewExpiredExceptionハンドラーの関連部分です。
public void handle() throws FacesException {
for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
Throwable t = context.getException();
if (t instanceof ViewExpiredException) {
ViewExpiredException vee = (ViewExpiredException) t;
FacesContext fc = FacesContext.getCurrentInstance();
Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
NavigationHandler nav = fc.getApplication().getNavigationHandler();
try {
requestMap.put("currentViewId", vee.getViewId());
HttpServletRequest orgRequest = (HttpServletRequest) fc.getExternalContext().getRequest();
fc.getExternalContext().redirect(orgRequest.getRequestURI());
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
sessionMap.put("refreshedMaxSesion",true);
fc.renderResponse();
}
catch(IOException e){ }
finally { i.remove(); }
}
}
// here queue will not contain any ViewExpiredEvents, let the parent handle them.
getWrapped().handle();
}
とナビゲーションケース
<navigation-rule>
<navigation-case>
<from-outcome>/app/ord1</from-outcome>
<to-view-id>/jsp/orderHist.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
上記の成功は限られていました。うまくいく場合もありますが、ページがまったくリダイレクトされない場合もあります。それは主にクロムで動作しますが、IEではまったく動作しませんでした。
を使用するなど、いくつかの変更を加えてみました
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
response.sendRedirect(vee.getViewId());
しかし、例外を除いて500のエラーページが表示されていたView must Exists...
ので、最初に何が間違っているのかを調べるために実験をやめました。ViewExpiredExceptionを発生させ、エラーがスローされたページにリダイレクトするというこの目標をアーカイブするにはどうすればよいですか?
私はmyFaces(2.1.7)とrichFaces(3.3.3)を使用しています。ありがとう