Spring WEB/MVC 使用 HTTPMessageConverter 的响应编写器

Spring WEB/MVC response writer using HTTPMessageConverter

我正在使用 spring-security:3.2.5.RELEASE 和 spring-webmvc:4.1.3.RELEASE。 我需要 return 有关登录失败的其他信息(添加原因,例如,用户被锁定、凭据错误等)。 我想使用 AuthenticationFailureHandler 并手动将附加信息写入响应:

@Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException exception) throws IOException, ServletException {
        logger.debug("Returning UNAUTHORIZED HttpStatus: " + exception.getMessage());
        try (PrintWriter writer = response.getWriter();){
            writer.write(jsonUtils.toJson(new ErrorDTO<String>(HttpStatus.MULTI_STATUS, 234546, exception.getMessage())));
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                    "Authentication Failed: " + exception.getMessage());
        }
    }

问题是,由于我不打算抛出 Spring 的消息转换器机制,此解决方案破坏了对多种内容类型的支持(例如,xml、JSON, 等等).

有没有一种方法可以使用消息转换器机制写入响应主体?

您可以创建一个控制器来处理身份验证失败,然后在您的 AuthenticationFailureHandler 中将请求转发到您的身份验证失败控制器。在控制器中,您可以轻松访问 Spring 的消息转换器机制。

为了转发请求,请看下面的代码片段(取自 Spring 的 SimpleUrlAuthenticationFailureHandlerdefaultFailureUrl 是转发目的地,即指向的路径您的身份验证错误处理控制器):

request.getRequestDispatcher(defaultFailureUrl).forward(request, response);