2

ユーザーを別のページにリダイレクトしたり転送したりしません。したがって、my SessionExpiredExceptionHandler(extends ExceptionHandlerWrapper)がViewExireExceptionを処理する場合。ユーザーが同じページに留まり、PrimeFacesダイアログを表示するようにしたい。セッションの有効期限が切れており、ユーザーが再度ログインする必要があることを通知するため(ダイアログベース)。サーブレット3.1関数を使用してユーザーにログイン/ログアウトしBasic/file、auth-methodを使用してユーザーをさまざまなシステムロールにマップしています。

現在、ビュー/ページは2分後に更新されますが、セッションは無効になりません。これは、ページが更新された2回目、4分後にのみ発生します。

    <session-config>
        <session-timeout>2</session-timeout>
    </session-config>

編集: メタタグによって更新されます:

<meta http-equiv="refresh" content="#{session.maxInactiveInterval}" />

SessionExpiredExceptionHandler例外が最初に発生したときにセッションオブジェクト(サーブレットログアウト)を無効にするにはどうすればよいですか?また、クライアントでJavaScript(expireDlg.show())を呼び出してPrimeFacesダイアログを表示するにはどうすればよいですか?

私は他のいくつかのスレッドを調べましたが、実行可能な解決策は見つかりませんでした。 セッションタイムアウト

SessionExpiredExceptionHandler

    @Override
    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());

            nav.handleNavigation(fc, null, "Home");
            fc.renderResponse();

        } finally {
            i.remove();
        }                                
        }
    }
    // At this point, the queue will not contain any ViewExpiredEvents.
    // Therefore, let the parent handle them.
    getWrapped().handle();
    }

web.xml

<exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/home.xhtml</location>
</error-page>
4

2 に答える 2

2

例外が最初に発生したときにSessionExpiredExceptionHandlerがセッションオブジェクトを無効にする(サーブレットログアウト)にはどうすればよいですか?

セッションはすでに無効化/期限切れになっているはずです(そうでない場合ViewExpiredExceptionはまったくスローされません)。そのため、自分で手動で無効化/期限切れにすることがどのように役立つかわかりません。ただし、その場合は、次のように無効にすることができます。

externalContext.invalidateSession();

クライアントでJavaScript(expireDlg.show())を呼び出してPrimeFacesダイアログを表示するにはどうすればよいですか?

PrimeFaces RequestContextAPIを使用して、プログラムでPrimeFacesにajax応答の完了時にいくつかのJSコードを実行するように指示できます。

RequestContext.getCurrentInstance().execute("expireDlg.show()");

実際にナビゲートしたくない場合は、例外ハンドラーからナビゲーションハンドラーブロックを削除することを忘れないでください。

于 2013-01-15T15:20:05.727 に答える
2

この解決策は私の場合にうまくいきました。Primefaces(3.3)がExceptionQueuedEventを飲み込んでいることを示しています。ViewExceptionHandlerが呼び出されたときに処理する例外はありません。その代わりにp:idleMonitor、イベントリストナーでコンポーネントを使用しました。メタリフレッシュタグも削除しました。

<p:idleMonitor timeout="#{(session.maxInactiveInterval-60)*1000}">
        <p:ajax event="idle" process="@this" update="sessionMsg" listener="#{userController.userIdleSession()}" />
        <p:ajax event="active" process="@this" update="sessionMsg" listener="#{userController.userActiveSession()}"/>
</p:idleMonitor>

奇妙なことの1つは、がセッションタイムアウトパラメータとtimeoutまったく同じである場合、リスナーが呼び出されないことです。web.xml

Bean関数

public void userIdleSession() {
    if (!userIdleMsgVisable) {
        userIdleMsgVisable = true;
        JsfUtil.addWarningMessage(JsfUtil.getResourceMessage("session_expire_title"), JsfUtil.getResourceMessage("session_expire_content"));            
    }
}

public void userActiveSession() {
        if (!userSessionDlgVisable) {
            userSessionDlgVisable = true;                     
            RequestContext.getCurrentInstance().execute("sessionExipreDlg.show()");            
        }
    }

ダイアログ(sessionExipreDlg)は、ナビゲーションハンドラーを使用して新しいスコープを取得し、ページを更新する代わりに、リダイレクトを呼び出しました。

public void userInactiveRedirect() {
        FacesContext fc = FacesContext.getCurrentInstance();
        userIdleMsgVisable = false;
        userSessionDlgVisable = false;
        sessionUser = null;         
        HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
        JsfUtil.findBean("homeController", HomeController.class).clearCurrentValues();        
        try {
            fc.getExternalContext().redirect(JsfUtil.getApplicationPath(request, false, null));            
        } catch (IOException ex) {
            BeanUtil.severe(ex.getLocalizedMessage());
        }
    }
于 2013-01-18T13:49:58.993 に答える