Tomcat自定义错误处理程序未捕获Spring MVC Interceptor错误响应

Bla*_*ack 4 java spring spring-mvc tomcat6 servlet-3.0

在我的Spring MVC应用程序(servlet 3.0)中,我在web.xml中定义了一个自定义错误处理程序:

<error-page>
    <location>/error</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

映射到Controller:

@Controller
class CustomErrorController {

 @RequestMapping("error")
 public String customError(HttpServletRequest request, HttpServletResponse response, Model model) {
...
 }
}
Run Code Online (Sandbox Code Playgroud)

这适用于大多数错误,例如404错误.但是,我还定义了一个Interceptor,如果没有经过身份验证的用户,它会返回403响应:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    HttpSession httpSession = request.getSession();
    ((HttpServletResponse) response).setStatus(HttpURLConnection.HTTP_FORBIDDEN);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

自定义错误处理程序没有捕获403响应- 浏览器没有响应,错误代码为403.

我认为这是因为我在拦截器中做错了 - 我应该如何更改拦截器中的代码以便正常的错误处理工作?

Wil*_*ing 12

更改response.setStatusresponse.sendError

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    response.sendError(HttpServletResponse.SC_FORBIDDEN);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这实际上发出了一个错误(而不仅仅是声明它) - 并强制Tomcat使用中定义的错误位置 web.xml

HttpServletResponse #setStatus(int)javadoc中所述

如果使用此方法[setStatus]设置错误代码,则不会触发容器的错误页面机制.如果出现错误并且调用者希望调用Web应用程序中定义的错误页面,则必须使用sendError(int,java.lang.String).