ユーザーがログアウトボタンをクリックしたときに、ユーザーをスタートビューにリダイレクトしたいと考えています。ログアウトは正しく行われ、開始ビューが要求された後、ユーザーにログイン ページが表示されます。これまでのところ、スタートビューが保護されており、ログインページにリダイレクトするフェーズリスナーをインターセプトしているため、私が望むものです。
ログアウト アクション:
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 が開始ビューでもログイン ビューでもなく、ユーザーがログアウト ボタンを押す直前にアクティブだったビューであることです。
他のすべてのナビゲーション ケースと同じように、ナビゲーション ルールのリダイレクトが機能するはずだと思いましたが、この場合は機能しません。誰かが理由を知っていますか?
前もって感謝します。