ErrorPageFilter将错误代码更改为HTTP 200 OK

时间:2015-03-17 10:11:04

标签: spring-boot

看起来Spring Boot的ErrorPageFilter将我的所有HTTP状态代码更改为200 OK(除了4xx)。这仅在部署到Servlet容器时发生。这是一个错误还是我做错了什么?

为了重现这一点,我创建了一个非常简单的Spring Boot应用程序:

@SpringBootApplication
@RestController
public class ResponseErrorController extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(ResponseErrorController.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(ResponseErrorController.class);
    }

    @RequestMapping("/304")
    public void lala(HttpServletResponse response) throws Exception {
        response.sendError(304, "Not Modified");
    }
}

当使用非嵌入式 Tomcat(或Jetty)在浏览器中打开http://localhost:8080/304启动时,我总是得到200 OK(没有内容)。

经过一些调试后,我发现ErrorPageFilter没有将包装的响应中的状态代码委托给真实的。我知道我可以在我的控制器中返回ResponeEntity,但我的实际问题发生在另一个发送304的框架的Servlet上 - 这个控制器只是为了演示。

有没有人见过这个?

1 个答案:

答案 0 :(得分:2)

400以下的状态代码没有错误,应通过setStatus(int)代替sendError(int)进行设置。因此,ErrorPageFilter仅处理状态码为> = 400的sendError调用。

所以这里有解决方法:

  • 如果它是您自己的代码:改为使用setStatus(int)

  • 如果第三方servlet或过滤器通过sendError(int)发送3xx状态代码:作为解决方法,您可以删除或替换ErrorPageFilter中的SpringBootServletInitializer

    protected WebApplicationContext run(SpringApplication application) {
        application.getSources().remove(ErrorPageFilter.class);
        return super.run(application);
    }