1. ホーム
  2. jsp

[解決済み] ログアウト後に、以前に閲覧した保護されたページを表示しないようにする。

2022-12-26 05:42:29

質問

ログアウト/サインアウト後に、エンドユーザーが制限されたページに戻ることができないようにする必要があります。しかし現在、エンド ユーザーはブラウザーの戻るボタン、ブラウザーの履歴へのアクセス、またはブラウザーのアドレス バーに URL を再入力することによっても、それを行うことができます。

基本的に、私は、エンド ユーザーがサインアウト後に制限されたページにどのような方法でもアクセスできないようにしたいのです。これを実現するには、どうすればよいでしょうか。JavaScript で戻るボタンを無効にすることはできますか?

どのように解決するのですか?

あなたは はできませんし、してはいけません。 ブラウザの戻るボタンや履歴を無効にしてください。それはユーザーエクスペリエンスにとって悪いことです。JavaScript のハックはありますが、信頼性が低く、クライアントが JS を無効にしている場合は機能しません。

あなたの具体的な問題は、要求されたページがサーバーから直接ではなく、ブラウザーのキャッシュから読み込まれることです。これは基本的には無害ですが、エンドユーザーが本当にサーバーから送られてきていると誤って考えてしまうため、確かに混乱します。

ブラウザに次のように指示するだけです。 ではなく キャッシュ すべて を制限された JSP ページ (したがってログアウトページ/アクションそのものだけではありません!) にキャッシュします。この方法では、ブラウザはキャッシュからではなく、サーバからページを要求することを強制され、その結果、サーバ上のすべてのログインチェックが実行されます。これを行うには フィルタ を設定する 必要なレスポンスヘッダ を設定します。 doFilter() メソッドに追加します。

@WebFilter
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        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);
    }

    // ...
}

これをマップする Filterurl-pattern のような、興味のある *.jsp .

@WebFilter("*.jsp")

また、保護されたページのみに制限をかけたい場合は、保護されたページすべてをカバーするURLパターンを指定する必要があります。例えば、すべてのページがフォルダ /app という URL パターンを指定する必要があります。 /app/* .

@WebFilter("/app/*")

さらに言えば、この作業を同じ Filter の中で行うことができます。

テスト前にブラウザのキャッシュをクリアするのを忘れないでください!;)

こちらもご覧ください。