1

ユーザーがログアウトボタンをクリックしたときに、ユーザーをスタートビューにリダイレクトしたいと考えています。ログアウトは正しく行われ、開始ビューが要求された後、ユーザーにログイン ページが表示されます。これまでのところ、スタートビューが保護されており、ログインページにリダイレクトするフェーズリスナーをインターセプトしているため、私が望むものです。

ログアウト アクション:

public String logout() {

    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext externalContext = context.getExternalContext();

    // invalidate session
    Object session = externalContext.getSession(false);
    HttpSession httpSession = (HttpSession) session;
    httpSession.invalidate();

    // let the navigation rule decide where to go...
    return null;
}

Faces ナビゲーション ルール:

<navigation-rule>
    <navigation-case>
        <from-action>#{loginBean.logout}</from-action>
        <to-view-id>/faces/index.xhtml</to-view-id>
        <redirect />
    </navigation-case>
</navigation-rule>

ForceLoginListener:

@Override
public void beforePhase(PhaseEvent event) {

    FacesContext context = FacesContext.getCurrentInstance();

    // extract view id from original request
    String viewId = context.getViewRoot().getViewId();

    if (// viewId is an 'protected' view AND not logged in //) {

        Application app = context.getApplication();

        // redirect to the login view
        ViewHandler viewHandler = app.getViewHandler();
        UIViewRoot viewRoot = viewHandler.createView(context, Constants.LOGIN_VIEW);
        context.setViewRoot(viewRoot);

    }

}

@Override
public void afterPhase(PhaseEvent event) {
}

@Override
public PhaseId getPhaseId() {
    return PhaseId.RENDER_RESPONSE;
}

私が今抱えている問題は、ユーザーに表示される URL が開始ビューでもログイン ビューでもなく、ユーザーがログアウト ボタンを押す直前にアクティブだったビューであることです。

他のすべてのナビゲーション ケースと同じように、ナビゲーション ルールのリダイレクトが機能するはずだと思いましたが、この場合は機能しません。誰かが理由を知っていますか?

前もって感謝します。

4

2 に答える 2

1

あなたの奇妙なアプローチは、通常のサーブレット フィルターForceLoginListenerに置き換える必要があります。

于 2012-07-23T22:23:44.687 に答える
0

あなたのケースで何が起こっているのか正確にはわかりませんが、 を使用してログアウト アクションをリダイレクトするように変更し、externalContextナビゲーション ルールに関するすべての手間を省くことができます。

public void logout() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext externalContext = context.getExternalContext();

    // invalidate session
    Object session = externalContext.getSession(false);
    HttpSession httpSession = (HttpSession) session;
    httpSession.invalidate();

    // redirect to your login view:
    externalContext.redirect(Constants.LOGIN_VIEW);
}
于 2012-07-22T01:35:34.463 に答える