6

ケース1:ログアウト:ログアウトした後、以前にアクセスしようとすると、login.jspに自動的にリダイレクトする必要があります

ケース2:セッションの有効期限が切れている:ユーザーがまだログインしているときにセッションの有効期限が切れた場合、前のページにアクセスしたときにセッションが自動的にsessionExpired.jspにリダイレクトされるようにする必要があります。

区別する方法は?現在、ログアウト時にセッションを無効にしています。

4

3 に答える 3

9

ログイン時に、有効期限が長い(> 24時間)Cookieを設定します。maxageを0に設定して、ログアウト時にこのCookieを削除します。

ログインしていないユーザー(つまり、無効なセッションID)をチェックすることができます。Cookieが存在しない場合は、login.jspにリダイレクトします。

Cookieが存在する場合、それは彼のセッションが期限切れになったことを意味するので、彼をsession-expired.jspにリダイレクトします

于 2010-07-22T06:45:06.680 に答える
8

期限切れのセッションをテストするに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.
于 2010-07-22T11:39:26.830 に答える
1

私の場合、ログアウト時にセッションをクリアし、HasLoggedOutという名前のブール値を作成してからこれをtrueに設定します。次に、このブール値がセッションに存在する場合は、ログアウトしていることがわかります。存在しない場合は、セッションがタイムアウトしたか、ユーザーがまったくログインしていません。

タイムアウトとログインしていないことをまだ区別できないので、私は通常、認証されたページを要求した場合、セッションタイムアウトページに送信することを決定します。このページは、次のようなログインページとしても機能します。

「おっと、あなたが誰であるかわかりません。セッションがタイムアウトしたか、まだログインしていません。以下からログインしてください。」

これにより、両方のシナリオに対応できます

于 2010-07-22T06:38:42.713 に答える