我正在使用@ControllerAdvice
来实现全局异常处理程序,但我在使用HttpServletResponse#sendError()
方法时遇到了一些问题。
@ExceptionHandler
可以捕获各种异常,但不能捕获HttpServletResponse#sendError()
个调用。我理解HttpServletResponse#sendError()
不是例外,但我需要处理它,然后重定向到一般错误页面。
我正在使用Spring Security进行身份验证,并且在失败的处理程序中,我将状态401
设置为响应:
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
String contentType = request.getContentType();
logger.info(contentType);
response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
}
然后在@ControllerAdvice
中,我尝试使用@ExceptionHandler
和@ResponseStatus
来抓住401
,但它不起作用:
@ResponseStatus (value=HttpStatus.UNAUTHORIZED, reason="You don't have access right on this page")//401
@ResponseBody
@ExceptionHandler(DataIntegrityViolationException.class)
public String handleHttpStatus(DataIntegrityViolationException e){
return "genericerror";
}
@ExceptionHandler
方法可以处理HttpServletResponse#sendError()
次调用吗?
答案 0 :(得分:1)
Spring Security是一个独立于Spring MVC的框架。 Spring Security是一个Servlet过滤器(看看你的web.xml
),它在到达Spring MVC之前拦截请求。您无法处理@ControllerAdvice
中Spring Security级别发生的异常(因为@ControllerAdvice
是Spring MVC的一部分)。
正如你自己所说,HttpServletResponse#sendError()
不会抛出异常。根据{{3}}文档,sends an error response to the client using the specified status code and clears the buffer.
在web.xml
文件中,您可以为错误响应代码定义静态网页(1),为(2)异常定义。例如:
<error-page>
<error-code>401</error-code>
<location>/errors/genericerror</location>
</error-page>