web-dev-qa-db-ja.com

ログアウト後に以前にアクセスした保護されたページがユーザーに表示されないようにする

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

基本的に、サインアウト後にエンドユーザーが制限されたページにアクセスできないようにする必要があります。どうすればこれを最高に達成できますか? JavaScriptで戻るボタンを無効にできますか?

98
raaz

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

具体的な問題は、要求されたページがサーバーから直接ではなく、ブラウザキャッシュからロードされることです。これは本質的には無害ですが、実際にはサーバーから来ていると誤って考えるため、エンドユーザーを混乱させます。

ブラウザにnotキャッシュallに制限されたJSPページ(したがって、ログアウトページ/アクション自体!)。この方法では、ブラウザはキャッシュからではなくサーバーからページを要求するため、サーバー上のすべてのログインチェックが実行されます。 doFilter()メソッドで 必要な応答ヘッダー を設定する Filter を使用してこれを行うことができます。

@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);
    }

    // ...
}

このFilterを対象のurl-patternにマッピングします(例:*.jsp)。

@WebFilter("*.jsp")

または、セキュリティで保護されたページのみにこの制限を適用する場合は、それらのセキュリティで保護されたすべてのページをカバーするURLパターンを指定する必要があります。たとえば、すべてが/appフォルダーにある場合、/app/*のURLパターンを指定する必要があります。

@WebFilter("/app/*")

さらに、ログインユーザーの存在を確認している場所と同じFilterでこのジョブを実行できます。

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

こちらもご覧ください:

133
BalusC

*ページを転送すると、URLパターンの.jspは機能しません。サーブレットも含めるようにしてください。これにより、アプリケーションはこの「戻る」ボタンの問題から保護されます。

5
Sathyan

ブラウザのバックボタンを無効にせずにこれを行う最も簡単な方法は、ログアウト後にユーザーが戻りたくないページのpage_loadイベントにこのコードを追加することです。

if (!IsPostBack)
    {
        if (Session["userId"] == null)
        {
            Response.Redirect("Login.aspx");
        }
        else
        {
        Response.ClearHeaders();
        Response.ClearContent();
        Response.Clear();
        Session.Abandon();
        Session.Remove("\\w+");
        Response.AddHeader("Cache-Control", "no-cache, no-store, max-age = 0, must-revalidate");
        Response.AddHeader("Pragma", "no-cache");
        Response.AddHeader("Expires", "0");
        }
    }
2
Ashraf Abusada

これを行う正しい方法は、

Vary: Cookie

保護されたページのヘッダー。ユーザーがログアウトしたら、セッションCookieをクリアします。その後、ログアウト後に戻ったときに、ブラウザのキャッシュが失われます。これには、キャッシュを完全に無効にしないという利点もあります。

0
Dan

ホームページをキャッシュしないようにブラウザに指示してみてください(適切なヘッダー-Expires、Cache-Control、Pragmaを使用)。ただし、動作が保証されているわけではありません。できることは、ページの読み込み時にサーバーにajax呼び出しを行って、ユーザーがログインしているかどうかを確認し、ログインしていない場合はリダイレクトすることです。

0
Bozho