1

私のログインフォームは にあります/account/login。この URL への GET 要求により、要求ハンドラーが呼び出さaccount/loginれ、論理ビュー名として返され、/WEB-INF/jsp/account/login.jspサービスが提供されます。

@RequestMapping(value="/account/login", method=RequestMethod.GET)
public String login()
{
    return "account/login";
}

/account/loginmy を呼び出すためのPOST 要求がUsernamePasswordAuthenticationFilterあるため、ログイン フォームは (GET を介して) によって提供され、(POST を介して) に送信され/account/loginます。

これはすべてうまくいきます。

ただし、ログインに失敗した場合は、HTTP リダイレクトを実行せず/WEB-INF/jsp/account/login.jspにサービスを提供したいと考えています。/account/login/WEB-INF/jsp/account/login.jsp

私はSimpleUrlAuthenticationFailureHandler.onAuthenticationFailure()次のようにオーバーライドしようとしました:

@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException
{
    request.getRequestDispatcher("account/login").forward(request, response);
}

ただし、これにより、不正なユーザー名/パスワードを に POST すると、404 応答が返されます/account/login

/WEB-INF/jsp/account/login.jsp/account/login.jsp、および他の多くの組み合わせを に渡そうとしましたが、何も機能してServletRequest.getRequestDispatcher()いないようです。

私が間違っていることはありますか?ディスパッチャが JSP 自体ではなく、リクエスト ハンドラにディスパッチしようとしているように感じますが、JSP ディスパッチ ワークフロー全体に精通しておらず、それを回避する方法を知ることができません。

4

1 に答える 1

0

質問を投稿した直後に偶然これを理解しました。将来、他の誰かに役立つようになる場合に備えて、ここで回答します。

ではonAuthenticationFailure()、 に渡し/account/login、ではなく次のようにgetRequestDispatcher()呼び出しました。include()forward()

@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException
{
    request.getRequestDispatcher("/account/login").include(request, response);
}

間違ったユーザー名やパスワードでログイン フォームを送信すると、ログイン フォーム JSP が POST の応答として提供され、正しいユーザー名/パスワードを送信しても my UsernamePasswordAuthenticationFilter!!が呼び出されます。

于 2012-06-14T22:55:55.877 に答える