1

JSF 2.0を使用して、ログアウト後にユーザーが戻ることを制限したいWebアプリケーションを作成しました。

解決策として、Great BalusCの回答を調べて別の方法を試しましたが、機能していません。

私が試したのは以下の通りです。

<h:commandLink value="logout" action="#{bean.makeMeLogut()}" />

私が持っている豆で

public void makeMeLogut() {
    try {
        // get response from JSF itself instead of coming from filter.
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("isLoggedIn", "false");
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        HttpServletResponse hsr = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        hsr.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        hsr.setDateHeader("Expires", 0); // Proxies.
        FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
    } catch (IOException ex) {
        System.out.println("can't logut...");
    }
}

BalusCの回答に従って、フィルターを作成する必要がありますが、JSF応答を使用して、それにヘッダーを設定することを考えました。しかし、それは機能していません。

私がどこで間違っているのか考えていますか?

4

1 に答える 1

1

制限されたページ自体の応答にこれらのヘッダーを設定していませんが、ログアウト アクションの応答にそれらのヘッダーのみを設定しています。そのため、制限されたページ自体は引き続きブラウザー キャッシュにあり、ログアウト アクションのみがブラウザー キャッシュにありません。ただし、戻るボタンはログアウト アクションには移動せず、制限されたページに移動します (したがって、ブラウザ キャッシュから引き続き提供されます)。

あなたが見つけた回答で概説されているように、これらの制限されたページへのすべてのリクエストにフィルターが本当に必要です。

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


具体的な問題とは関係ありませんが、無効にする直前にセッション マップを操作しても意味がありません。セッションの無効化は、マップ全体を暗黙のうちにクリアします (基本的にセッションの属性を参照するため)。セッションマップを操作する行を削除するだけです。

また、標準出力のみを実行するキャッチIOExceptionは非常に貧弱です。全体を削除してメソッドtry-catchに追加throws IOExceptionします。コンテナーは、エラー ページでそれを処理します。

于 2012-11-22T13:38:21.163 に答える