回答:
ブラウザの戻るボタンまたは履歴を無効にすることはできますが、無効にしないでください。これはユーザーエクスペリエンスにとって悪いことです。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
ログインしたユーザーの存在を確認するのと同じ場所でこのジョブを実行できます。
テストする前にブラウザのキャッシュをクリアすることを忘れないでください!;)
doFilter()
メソッドをオーバーライドする別のFilterクラスを作成しました。ログアウトボタンを押すと、サーブレットにリダイレクトされ、セッションが無効になります。doFilter()
ここでこの方法がどのように機能するかはわかりません。これを実装する方法を教えていただけますか?のように、従うべき正しい手順。ありがとう。
sendRedirect(...)
との両方の後でテストされていforward()
ます。
ブラウザのバックボタンを無効にせずにこれを行う最も簡単な方法は、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");
}
}