103

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

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

4

7 に答える 7

142

ブラウザの戻るボタンまたは履歴を無効にすることはできますが、無効にしないでください。これはユーザーエクスペリエンスに悪影響を及ぼします。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、ログインしたユーザーの存在を確認するのと同じ方法でこのジョブを実行できます。

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

参照:

于 2010-11-16T12:46:01.887 に答える
5

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

于 2012-03-03T20:28:07.477 に答える
1

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

Vary: Cookie

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

于 2016-11-05T12:38:38.150 に答える
0

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

于 2010-11-16T12:46:56.140 に答える
0

フィルタを実装する代わりに、保護されたすべての JSP またはすべてのパスに「キャッシュなし」フィルタを設定することもできます。これは、アプリケーションが小規模で、特定のページに対してのみこのプロパティをカスタマイズする場合に適しています。キャッシュされるべきではないすべての保護された JSP に、次の Java スニペットを追加できます。

<%
  response.addHeader("Pragma", "no-cache");
  response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  response.setDateHeader("Expires", 0);
%>

JSP ではない場合、これは、ルーティングが定義されているコントローラーで使用され、「HttpServletResponse」オブジェクトのヘッダーを設定することもできます。

于 2021-06-18T09:17:07.310 に答える