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

时间:2014-02-09 23:10:49

标签: java spring spring-mvc tomcat6 servlet-3.0

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

<error-page>
    <location>/error</location>
</error-page>

映射到Controller:

@Controller
class CustomErrorController {

 @RequestMapping("error")
 public String customError(HttpServletRequest request, HttpServletResponse response, Model model) {
...
 }
}

这适用于大多数错误,例如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;
}

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

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

1 个答案:

答案 0 :(得分:12)

response.setStatus更改为response.sendError

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

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

中定义的错误位置

HttpServletResponse#setStatus(int) javadoc

中所述
  

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