ケース1:ログアウト:ログアウトした後、以前にアクセスしようとすると、login.jspに自動的にリダイレクトする必要があります
ケース2:セッションの有効期限が切れている:ユーザーがまだログインしているときにセッションの有効期限が切れた場合、前のページにアクセスしたときにセッションが自動的にsessionExpired.jspにリダイレクトされるようにする必要があります。
区別する方法は?現在、ログアウト時にセッションを無効にしています。
ケース1:ログアウト:ログアウトした後、以前にアクセスしようとすると、login.jspに自動的にリダイレクトする必要があります
ケース2:セッションの有効期限が切れている:ユーザーがまだログインしているときにセッションの有効期限が切れた場合、前のページにアクセスしたときにセッションが自動的にsessionExpired.jspにリダイレクトされるようにする必要があります。
区別する方法は?現在、ログアウト時にセッションを無効にしています。
ログイン時に、有効期限が長い(> 24時間)Cookieを設定します。maxageを0に設定して、ログアウト時にこのCookieを削除します。
ログインしていないユーザー(つまり、無効なセッションID)をチェックすることができます。Cookieが存在しない場合は、login.jspにリダイレクトします。
Cookieが存在する場合、それは彼のセッションが期限切れになったことを意味するので、彼をsession-expired.jspにリダイレクトします
期限切れのセッションをテストするにHttpServletRequest#getRequestedSessionId()
は、戻ってこないかnull
(クライアントがセッションCookieを送信したため、セッションがまだ有効であると見なす)、HttpServletRequest#isRequestedSessionIdValid()
戻ってfalse
(サーバー側でセッションが期限切れになっている)かどうかを確認します。
一言で言えば:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
response.sendRedirect(request.getContextPath() + "/sessionexpired.jsp");
} else if (session == null || session.getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "/login.jsp");
} else {
chain.doFilter(request, response);
}
}
余分なクッキーに煩わされる必要はありません。Filter
これを保護されたページをカバーするようにマップしurl-pattern
ます(したがって、sessionexpiredページとloginページを除外します!)。
保護されたページでブラウザによるページキャッシュを無効にすることを忘れないでください。無効にしないと、ブラウザの履歴に戻ったときに、サーバーに新しいリクエストを送信する代わりに、ウェブブラウザがキャッシュからページを読み込みます。これは、呼び出す前に 同じフィルターで次のことを行うことで実現できChain#doFilter()
ます。
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.
私の場合、ログアウト時にセッションをクリアし、HasLoggedOutという名前のブール値を作成してからこれをtrueに設定します。次に、このブール値がセッションに存在する場合は、ログアウトしていることがわかります。存在しない場合は、セッションがタイムアウトしたか、ユーザーがまったくログインしていません。
タイムアウトとログインしていないことをまだ区別できないので、私は通常、認証されたページを要求した場合、セッションタイムアウトページに送信することを決定します。このページは、次のようなログインページとしても機能します。
「おっと、あなたが誰であるかわかりません。セッションがタイムアウトしたか、まだログインしていません。以下からログインしてください。」
これにより、両方のシナリオに対応できます