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


99

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

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


7
Post-request-get pattern.Google itを使用します。

回答:


137

ブラウザの戻るボタンまたは履歴を無効にすることはできますが、無効にしないでください。これはユーザーエクスペリエンスにとって悪いことです。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);
    }

    // ...
}

この地図Filterの上にurl-pattern、たとえば、関心の*.jsp

@WebFilter("*.jsp")

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

@WebFilter("/app/*")

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

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

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


2
時々これでは十分ではありません、私はそのような問題を抱えたことを覚えています。ブラウザーは最後のページを記憶するだけです。しかし、それはIE6だったのかもしれません。思い出せません:)
Bozho 2010年

3
@Bozho:不完全なヘッダーのセットを提供したか、ブラウザーのページがまだキャッシュに残っています。
BalusC 2010年

1
@Chris:Firefoxと他のすべてのブラウザーで動作します。あなたの問題は他の場所で引き起こされています。おそらく、キャッシュをクリアするのを忘れましたか?または、それらのヘッダーが間違った応答に設定されていますか?
BalusC 2013

@BalusC doFilter()メソッドをオーバーライドする別のFilterクラスを作成しました。ログアウトボタンを押すと、サーブレットにリダイレクトされ、セッションが無効になります。doFilter()ここでこの方法がどのように機能するかはわかりません。これを実装する方法を教えていただけますか?のように、従うべき正しい手順。ありがとう。
Anjan Baradwaj 2013年

私にとってはうまくいきました。sendRedirect(...)との両方の後でテストされていforward()ます。
Hal50000 2014

5

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


2

ブラウザのバックボタンを無効にせずにこれを行う最も簡単な方法は、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");
        }
    }

6
回答は役に立ちますが、選択したOPのプログラミング言語に関連する回答を投稿してください。C#ソリューションは、OPのJava EEプロジェクトでは役に立ちません。
ブハケシンディ2015

0

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


13
ただし、悪意のある人がJavaScriptを無効にすると、これは機能せず、ページは表示されます。
acme '13年

0

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

Vary: Cookie

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.