3

Spring Security 3.0.6を使用していますが、次のことができるようにしたいと思います。

ユーザーがページ上にいてセッションタイムアウトが発生した場合、ユーザーはログインページに移動し、有効なログイン時にタイムアウトが発生したページにリダイレクトされます。

現在、security.xmlファイルに次のものがあります。

<http auto-config="true" use-expressions="true">
    <form-login
        login-page="/login" 
        default-target-url="/main" 
        always-use-default-target="false"
        authentication-failure-url="/login.html?error=true"
        authentication-success-handler-ref="authenticationSuccessHandler" />
    <remember-me/>
    <logout logout-success-url="/login" />
</http>

これは私の認証クラスです:

public class AuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {

    String url = "";

    HttpSession session = request.getSession(false);
    if (session != null) {
        SavedRequest savedRequest = (SavedRequest) session.getAttribute(WebAttributes.SAVED_REQUEST);
        if (savedRequest != null) {
            url = savedRequest.getRedirectUrl();
        }
    }

    System.out.println("url: "+ url);

    if (url == "") {
        response.sendRedirect(request.getContextPath()+"/main");
    } else {
        response.sendRedirect(url);
    }
}

}

次のようなJavaScriptを使用して、ユーザーをログインページに戻します。

window.location.href="/login";

私の認証クラスでは、URLは常にnullです。Springが正しいページにリダイレクトされるようにこれを機能させるにはどうすればよいですか?

4

2 に答える 2

5

Spring Security はデフォルトでカスタム コードを作成できるため、カスタム コードを作成する必要はありません。authentication-success-handler-ref hereに関するドキュメントをご覧ください。

認証成功ハンドラ参照

これは、default-target-url および always-use-default-target の代替として使用でき、認証が成功した後のナビゲーション フローを完全に制御できます。値は、アプリケーション コンテキスト内の AuthenticationSuccessHandler Bean の名前である必要があります。デフォルトでは、SavedRequestAwareAuthenticationSuccessHandlerの実装が使用され、default-target-url が挿入されます。

成功した認証リクエストを処理するために使用する必要がある AuthenticationSuccessHandler Bean への参照。実装は常に後続の宛先へのナビゲーションを処理する必要があるため、default-target-url (または always-use-default-target) と組み合わせて使用​​しないでください。

于 2012-05-21T21:54:23.327 に答える
2

前の回答に対するコメントから、2 つのオプションが表示されます。

  1. たとえば、HttpSessionRequestCache を拡張し、そのキャッシュに ajax リクエストを置かないようにすることで、カスタマイズされた RequestCache を作成します。

  2. 独自の RedirectStrategy を実装して、クライアント側コードによって解釈されるカスタム ajax 応答を送信します。場合によっては、カスタム RedirectStrategy の設定が簡単ではないことがあります。これは、さまざまな要素の構成属性がないためです。たとえば、SessionManagementFilter の場合、独自のインスタンスを作成し、カスタム リダイレクト戦略を設定する必要があります。

役立つことを願っています

于 2013-06-25T18:10:08.207 に答える