在我的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中的代码,以便正常的错误处理工作?
答案 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)。