java - Tomcat 自定义错误处理程序未捕获 Spring MVC 拦截器错误响应

标签 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 错误。 但是,我还定义了一个拦截器,如果没有经过身份验证的用户,它会返回 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 的响应。

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

最佳答案

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 中所述

If this method [setStatus] is used to set an error code, then the container's error page mechanism will not be triggered. If there is an error and the caller wishes to invoke an error page defined in the web application, then sendError(int, java.lang.String) must be used instead.

关于java - Tomcat 自定义错误处理程序未捕获 Spring MVC 拦截器错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21666392/

相关文章:

spring - Spring batch和cloudera hadoop之间的版本不兼容

java - 统计 Mule 流处理的请求数

java - 带有 Netbeans 安装程序的 JDK 8 在没有警告的情况下退出

java - android 的 hello world 教程应用程序不工作

java - 通过小程序传递参数来添加两个整数值

java - Spring 安全 : using relative path

spring-mvc - 自己的Spring OAuth2服务器以及3rdparty OAuth提供程序

java - Spring MVC 4 + Tomcat 7,如何用JavaConfig实现HTTPS?

java - Spring框架有命令行界面吗

java - 如何使用 CMIS apache Chemistry 将文件夹(有子级)从一个存储库传输到另一个存储库