私は JSF を初めて使用し、JSF アプリケーションのセッション タイムアウトの処理に取り組んでいます。コードを ajax 呼び出しで機能させようとしていますが、これまでのところそれを達成できません。私は2つのアプローチを試しました:
アプローチ1:SessionListener(クリーンアップ作業用)およびSessionFilter(すべてのリクエストをフィルタリングし、セッションがタイムアウトしたかどうかを確認するため)フィルターの私のコードスニペット:
if ((request instanceof HttpServletRequest)
&& (response instanceof HttpServletResponse)) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// is session expire control required for this request? (not required for home page or timeout page or JSF resources)
if (isSessionControlRequired(httpServletRequest)) {
// is session invalid?
if (isSessionInvalid(httpServletRequest)) {
String timeoutUrl = httpServletRequest.getContextPath() + "/timeout.html";
logger.info("session is invalid! redirecting to timeoutpage : " + timeoutUrl);
//httpServletResponse.sendRedirect(timeoutUrl);
//final FacesContext facesContext = FacesContext.getCurrentInstance();
//final ExternalContext externalContext = facesContext.getExternalContext();
//externalContext.dispatch("/start.jsp");
RequestDispatcher rd = httpServletRequest.getRequestDispatcher("/timeout.html");
rd.forward(httpServletRequest, httpServletResponse);
return;
}
}
}
chain.doFilter(request, response);
アプローチ 2: CustomeExceptionHandler の処理 ViewExpiredException handle() のコード スニペット:
for (final Iterator<ExceptionQueuedEvent> it = getUnhandledExceptionQueuedEvents().iterator(); it.hasNext();) {
Throwable t = it.next().getContext().getException();
while ((t instanceof FacesException || t instanceof ELException) && null != t.getCause()) {
t = t.getCause();
}
if (t instanceof ViewExpiredException) {
final FacesContext facesContext = FacesContext.getCurrentInstance();
final ExternalContext externalContext = facesContext.getExternalContext();
final Map<String, Object> requestMap = externalContext.getRequestMap();
NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
try {
final String viewId = ((ViewExpiredException) t).getViewId();
String message = "View has expired. " + viewId;
logger.error(message);
requestMap.put("errorMsg", message);
try {
requestMap.put("currentViewId", viewId);
nh.handleNavigation(facesContext, null, "/timeout.html");
facesContext.renderResponse();
// Force JSF to render the error page in its entirety to the ajax response.
//facesContext.setViewRoot(facesContext.getApplication().getViewHandler().createView(facesContext, "/timeout.html"));
//facesContext.getPartialViewContext().setRenderAll(true);
//facesContext.renderResponse();
//RequestContext rc = RequestContext.getCurrentInstance();
//rc.execute("addTitleDialog.show()");
//externalContext.dispatch("/start.jsp");
}
catch (final Exception e) {
logger.error("Cannot dispatch to /start.jsp");
}
facesContext.responseComplete();
}
finally {
it.remove();
}
}
else {
logger.error(t.getMessage(), t);
}
}
getWrapped().handle();
}
これらのアプローチはどちらも、ajax 以外の POST 呼び出しでは機能しますが、ajax 呼び出しでは機能しません。アプリをデバッグ モードで実行すると、ajax 呼び出しのすべてのステートメントをステップ実行することもできます。これにより、コントロールがコードに到達して実行されるが、何らかの理由で UI で何も起こらないことがわかります。ユーザーをタイムアウト ページにリダイレクトしようとしましたが、理想的なのは、JSF ダイアログを表示し、[OK] を押すとユーザーをホーム画面に移動することです (私のアプリにはログイン画面がありません)。基本的な質問もあります。 、ビューの有効期限はセッション タイムアウトとまったく同じですか?
どんな助けでも大歓迎です、ありがとう、スワティ。