如何解决ErrorPageFilter无法转发错误页面的日志报错?
解决Spring Boot ErrorPageFilter响应已提交无法转发错误页面的问题
针对你遇到的这个ErrorPageFilter无法转发错误页面的问题,结合你的技术栈(Ubuntu 14.04 + Tomcat 8 + Spring Boot 1.5.9 + Kotlin 1.2.21),我给你几个亲测有效的排查和解决方向:
1. 为什么你之前的禁用方法没生效?
你在init块里调用setRegisterErrorPageFilter(false)的时机不对——SpringBootServletInitializer的初始化流程中,这个设置会被后续的自动配置覆盖,所以没起到作用。
正确禁用ErrorPageFilter的方式
推荐用注册FilterRegistrationBean的方式强制禁用它,把这段代码加到你的MyApplication类里:
@Bean fun disableErrorPageFilter(): FilterRegistrationBean<ErrorPageFilter> { val errorPageFilter = ErrorPageFilter() val registrationBean = FilterRegistrationBean(errorPageFilter) registrationBean.isEnabled = false return registrationBean }
或者在application.properties里添加更简洁的配置:
server.error.whitelabel.enabled=false
2. 检查业务代码的响应提交问题
这个错误最本质的原因是:你的/api/login接口在抛出异常之前,已经向客户端写入了部分响应并提交(比如直接操作HttpServletResponse的Writer、OutputStream,或者调用了flush()方法),导致后续Spring的错误处理机制无法再转发错误页面。
去排查你的登录接口代码:
- 有没有直接调用
response.getWriter().write(...)或者response.getOutputStream().write(...)? - 有没有在写响应后没有及时return,后续代码又抛出了异常?
- 尽量用Spring的
ResponseEntity或者@ResponseBody来返回结果,避免直接操作HttpServletResponse,这样能保证响应的生命周期由Spring统一管理。
3. 调整Tomcat的错误处理配置
如果上面的方法都没解决,可以尝试修改Tomcat的conf/context.xml,添加Valve来禁用Tomcat自带的错误报告,避免和Spring Boot的错误处理冲突:
<Context> <Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false"/> </Context>
先从检查业务代码的响应提交问题入手,这是绝大多数情况下的根源,再尝试禁用ErrorPageFilter或调整Tomcat配置,应该能解决这个问题。
内容的提问来源于stack exchange,提问作者gary
相关产品推荐
相关产品推荐

