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 的 SimpleUrlAuthenticationFailureHandler
,defaultFailureUrl
是转发目的地,即指向的路径您的身份验证错误处理控制器):
request.getRequestDispatcher(defaultFailureUrl).forward(request, response);
我正在使用 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 的 SimpleUrlAuthenticationFailureHandler
,defaultFailureUrl
是转发目的地,即指向的路径您的身份验证错误处理控制器):
request.getRequestDispatcher(defaultFailureUrl).forward(request, response);