看起来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上 - 这个控制器只是为了演示。
有没有人见过这个?
答案 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);
}