2

Glassfish3.1のJSFログインフォームでセッション固定を防ぐ方法を見つけようとしています。サーブレットを使用するのは簡単だったので、JSFでも同じことをしようとしています(この質問に基づいて:JSF要求からセッションID値を取得する):

FacesContext fCtx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
session.invalidate();   
fCtx.getExternalContext().getSession(true); 

動作しているようですが、ブラウザの戻るボタンをクリックしてログインの詳細を再入力すると、次のように表示されます。

javax.faces.application.ViewExpiredException:viewId:/index.xhtml-ビュー/index.xhtmlを復元できませんでした。

「更新」して再送信した後にのみ、再び機能します。

その理由は何でしょうか?

4

1 に答える 1

3

JSFページをキャッシュしないようにブラウザに指示する必要があります。Filter次のようにマップされ、メソッド@WebFilter(servletNames={"facesServlet"})で次のジョブを実行するを作成しますdoFilter()

HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(req, res);

これにより、ブラウザは戻るボタンを押すと新しいGETリクエストを実行します。それ以外の場合は、キャッシュからページを返すだけで、セッションの無効化によってサーバー側のビューステートが失われるため、フォームの送信は失敗します。

于 2011-05-22T13:55:43.963 に答える