エンドユーザーがログアウト/ログアウト後に制限されたページに戻ることができないようにする必要があります。しかし、現在、エンドユーザーは、ブラウザの戻るボタン、ブラウザの履歴にアクセスするか、ブラウザのアドレスバーにURLを再入力することで、それを行うことができます。
基本的に、サインアウト後にエンドユーザーが制限されたページにアクセスできないようにする必要があります。どうすればこれを最高に達成できますか? JavaScriptで戻るボタンを無効にできますか?
あなたはブラウザの戻るボタンまたは履歴を無効にすることができますし、すべきではありません。それはユーザーエクスペリエンスにとっては悪いことです。 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
でこのジョブを実行できます。
テストする前にブラウザのキャッシュをクリアすることを忘れないでください! ;)
*ページを転送すると、URLパターンの.jspは機能しません。サーブレットも含めるようにしてください。これにより、アプリケーションはこの「戻る」ボタンの問題から保護されます。
ブラウザのバックボタンを無効にせずにこれを行う最も簡単な方法は、ログアウト後にユーザーが戻りたくないページの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");
}
}
これを行う正しい方法は、
Vary: Cookie
保護されたページのヘッダー。ユーザーがログアウトしたら、セッションCookieをクリアします。その後、ログアウト後に戻ったときに、ブラウザのキャッシュが失われます。これには、キャッシュを完全に無効にしないという利点もあります。
ホームページをキャッシュしないようにブラウザに指示してみてください(適切なヘッダー-Expires、Cache-Control、Pragmaを使用)。ただし、動作が保証されているわけではありません。できることは、ページの読み込み時にサーバーにajax呼び出しを行って、ユーザーがログインしているかどうかを確認し、ログインしていない場合はリダイレクトすることです。