2

Tomcat (7.0.34) レルムのフォーム ベース認証を使用しています。私の問題を以下に説明します。

保護されたページであるsignA.jspがあります。次に、ログインページであるauth.jspがあります。

アプリケーションへの最初のリクエストはsignA.jspに送られ、次にリクエストはauth.jspにリダイレクトされ(現時点ではユーザーは認証されていないため)、ユーザーはログイン資格情報を入力して送信を押すことができます。Tomcat は j_security_check としてアクションを取得します。認証に成功すると、エラーがなければ、リクエストは signA.jsp に戻り、アプリケーションのホームページhome.jspにリクエストが転送されます。これは完全に正常に機能します。

認証が失敗した場合、リクエストはerrorA.jspファイルに送られ、get パラメータとしてstatusIdとともにリクエストが signA.jsp にリダイレクトされ、さらにリクエストはauth.jspに再度リダイレクトされます。

ここで、アプリケーションにログインしていて、ページC.jspにいるときにセッションがタイムアウトし、クリックしてアプリケーションの他のページに移動すると、リクエストがauth.jspにリダイレクトされるとします。これは実際には問題ありません. しかし、再度ログインしようとすると、前回のログイン セッションで最後にアクセスしたページにリクエストが送信されることがわかりました。この場合はC.jspです。理想的には、アプリケーション全体で使用されるセッションでログインの詳細とその他の詳細を保持するhome.jspである、ログイン後の最初のデフォルト ページを通過するように要求したかったでしょう。

何が問題なのですか?これを修正するための解決策を提供していただければ幸いです。

4

1 に答える 1

0

同様の問題がありました。何時間も掘り下げて、ハッキーな解決策を思いつきました。

セッション オブジェクトでは (.isNew() などを呼び出して)、タイムアウトがあったかどうかはわかりません。タイムアウトがあった場合、Tomcat レルムは既に新しいセッションを作成するためです。したがって、ログインに成功したら、セッションで属性を設定する必要があります。

保護された URL にフィルターを追加します。これを web.xml に追加することを忘れないでください。ログインサーブレットが下に/protected/loginあり、他のすべてのリクエストが送信されるとしましょう/protected/some_other_url

属性が nullのリクエストが来ている場合/protected/some_other_urlは、タイムアウトが発生したことを意味します。

path.startsWithフィルターの URL パターンが正しいかどうか、またはログイン サーブレットが異なるプレフィックスの下にある可能性があるかどうかなどのチェックを省略できます。

public class TimeoutFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        String path = request.getServletPath();

        // login after timeout occurred
        if (session != null && session.getAttribute(YOUR_ATTRIBUTE) == null && path.startsWith("/protected") && !path.equals("/protected/login")) {
            response.sendRedirect("/protected/YOUR_START_PAGE");
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }

}
于 2013-11-01T19:55:24.337 に答える