0

JSF 2.0 でのセッションの管理方法について混乱しています。

セッションの有効期限が切れると表示される、ログイン、データ、情報、およびセッションの有効期限を含む 4 つのページを作成しました。

ログアウト ボタンをクリックすると、次のアクション メソッドを呼び出してセッションが無効になります。

public String logout(){
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "logout?faces-redirect=true";
}

予想どおり、コードはログアウトページにリダイレクトしますが、ブラウザの戻るボタンをクリックすると、データページに移動してすべての情報が表示されますが、セッションがすでに期限切れになっている場合は、セッション期限切れページが表示されるはずです。

目的の機能を実現するにはどうすればよいですか?

4

2 に答える 2

4

ユーザーがブラウザの戻るボタンをクリックしたときに前のページが表示されるという事実は、ページがキャッシュされ、サーバーから要求されたのではなく、ブラウザのキャッシュから表示されたことを示しています。これを修正するには、HTTP 応答ヘッダーを適切に設定する必要があります。これは、すべてのブラウザーで Web ページがキャッシュされていないことを確認するで事前に回答されています。BalusC を繰り返しますが、これらは次のとおりです。

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.

これらのヘッダーを設定する最も適切な場所は Web フィルターです。そこには JSF の所有物は必要ないようです。詳細については、 JSF Web アプリケーションの [戻る] ボタンを回避する への回答を参照してください。BalusC のコードを繰り返すには、次のものが必要です。

@WebFilter("/secured/*")
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            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);
    }

    // ...

}

フィルタリングする必要があるページを指定することを忘れないでください。このようにして、要求された新しいページは常にサーバーから送信され、キャッシュされなくなります。そのため、ユーザーがログアウト後に (セッションの無効化とリダイレクトの送信によって) 保護されたページにアクセスしようとすると、標準のセキュリティ手段が作動し (他のフィルター)、ユーザーがそれらのページにアクセスできなくなります。

次に行うことは、セッションが無効化/タイムアウトしたときに、すでに開いているページをどのように処理するかを JSF に説明することです。つまり、どうすればsに対処できますかViewExpiredException。これは、JSF 2 でセッションの有効期限と ViewExpiredException を処理する方法で回答されていますか? およびjavax.faces.application.ViewExpiredException:同期 POST リクエストの場合、およびAJAX リクエストのJSF/PrimeFaces ajax リクエストでのセッション タイムアウトおよび ViewExpiredException 処理で、ビューを復元できませんでした。

基本的に、前者の場合、次の行を web.xml に追加する必要があります。

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/expired.xhtml</location>
</error-page>

後者については、この目的のために設計された JSF ユーティリティ ライブラリOmniFacesとそのFullAjaxExceptionHAndlerを参照することを強くお勧めします。

于 2013-07-23T07:48:32.690 に答える
0

サーバー上でセッションが無効になった後でも、ブラウザはデータ ページに戻ります。これは、ページがブラウザのメモリにキャッシュされているためです。

ブラウザの戻るボタンがどのように機能するかについては、こちらに従ってください。

これを参照して、問題に取り組むことができます。

于 2013-07-23T06:09:30.857 に答える