2

私は 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] を押すとユーザーをホーム画面に移動することです (私のアプリにはログイン画面がありません)。基本的な質問もあります。 、ビューの有効期限はセッション タイムアウトとまったく同じですか?

どんな助けでも大歓迎です、ありがとう、スワティ。

4

0 に答える 0