4

アプリケーションにログアウトを実装しようとしているので、次のようにしました。

public String logout(){
    try{
        FacesContext facesContext = FacesContext.getCurrentInstance();  
        ExternalContext ex = facesContext .getExternalContext();  
        ex.invalidateSession(); 
        return "success"; 
    }catch(Exception e){
        return "error";
    }
}

しかし、ユーザーがログに記録されているかどうかを確認すると、「はい」と表示されます:

public class AuthenticateListener implements PhaseListener {


    @Override
    public void afterPhase(PhaseEvent event) {
        AuthorizedUser authorized = (AuthorizedUser) Util.getHandler("authorized");
        if (authorized.getUser() == null) {
            System.out.println("Not Logged");
        } else {
            System.out.println("Logged");
        }
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // TODO Auto-generated method stub

    }

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

}

何か不足していますか?セッションを無効にした後、AuthorizedUser (sessionScoped) の新しいインスタンスを取得するべきではありませんか?

編集: 誰かがそれを必要とする場合、getHandler を追加します;)

public static Object getHandler(String handlerName) {

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ELResolver resolver = facesContext.getApplication().getELResolver();

    Object uh = resolver.getValue(elContext, null, handlerName);
    return uh;
}
4

2 に答える 2

1

セッションは、現在のリクエスト/レスポンスで引き続き使用できます。次のリクエストでは使用できなくなります。ブラウザが指定された URL で新しいリクエストを送信するように指示されるように、無効化の後にリダイレクトを送信する必要があります。

return "success?faces-redirect=true"; 

または、昔ながらのナビゲーションケースをまだ使用している場合 (戻り値はそれを示唆しています。ファイル名が「成功」のビューを持つのは奇妙です)、<redirect/>代わりにナビゲーションケースに追加します。

それでもうまくいかない場合は、ユーザーをセッションに保存する方法にバグがあります。たとえば、CDI@Namedと JSFを混在@SessionScopedさせたり、ログイン ユーザーをインスタンス変数ではなく静的変数として割り当てたりすると、実際にはアプリケーション スコープに格納されます。

以下も参照してください。

于 2012-12-20T13:57:20.737 に答える
-2

logout メソッド内で次のコードを使用します。

HttpSession oldsession = (HttpSession) FacesContext
                .getCurrentInstance().getExternalContext().getSession(false);
oldsession.invalidate();

これは機能します。お役に立ちましたらお知らせください。

于 2012-12-20T12:29:46.607 に答える