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";
}

POST 请求/account/login调用 my UsernamePasswordAuthenticationFilter,因此登录表单既由 (via GET) 提供,也由 (via POST) 提交/account/login

这一切都很好。

但是,在登录失败的情况下,我希望/WEB-INF/jsp/account/login.jsp不进行 HTTP 重定向的情况下获得服务,即将错误的用户名/密码发布到/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/logingetRequestDispatcher(),并且我也调用include()而不是 a forward(),如下所示:

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

使用不正确的用户名和/或密码提交登录表单会导致登录表单 JSP 被用作 POST 的响应,并且提交正确的用户名/密码仍然会调用我的UsernamePasswordAuthenticationFilter!!

于 2012-06-14T22:55:55.877 回答