【问题标题】:Spring MVC Interceptor error response not caught by Tomcat custom error handlerTomcat 自定义错误处理程序未捕获 Spring MVC 拦截器错误响应
【发布时间】:2014-03-07 03:30:07
【问题描述】:

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

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

映射到控制器:

@Controller
class CustomErrorController {

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

这适用于大多数错误,例如 404 错误。 但是,我还定义了一个拦截器,如果没有经过身份验证的用户,它会返回 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 中的代码才能正常处理错误?

【问题讨论】:

  • 您如何将错误代码附加到错误页面?

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


【解决方案1】:

将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) 代替。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 2015-10-07
    • 2016-03-03
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2011-12-29
    • 2014-06-11
    相关资源
    最近更新 更多