我们想实现一个“fault barrier”策略来管理我们应用程序中的异常。我们的应用程序拥有的一件事是“回传”响应的概念,基本上是一个空操作,我们希望优先返回它而不是抛出 500、400 等。HTTP 状态代码 - 例如我们面向外部的应用程序应该始终返回有效响应,即使引发了底层异常 - 我们希望在应用程序内部处理该异常,并且仍然返回有效的 noop 响应。
我们的第一个实现是一个 Servlet 过滤器,它将所有请求包装在一个 try/catch block 中,并返回 catch 的默认返回值,例如:
try{
chain.doFilter()
} catch (Throwable t) {
generatePassbackResponse(HttpServletRequest req, HttpServletResponse res)
}
虽然这大部分都有效,而且感觉很好很干净(我们可以返回漂亮的文本,适本地设置内容/类型等),但一个问题似乎是当抛出异常时,响应仍然通过状态 -代码:500。
HttpServletResponse.setStatus(200) 没有效果,javadoc确实说它只适用于正常请求。
我们的第二个实现想法是我们可能必须转发到另一个页面,或者将 errorPage 插入 web.xml 并手动将错误发送到该页面 - 尽管我们对是否有人有具体建议感兴趣。
最佳答案
设置响应的 HTTP 状态有两种方法:
- setStatus() 只会设置状态
- sendError() 将设置状态并触发
<error-page>
机制
sendError 的 Javadoc 表示在调用 sendError 后应考虑响应已提交(这可以解释您的应用服务器的行为)。
实现自定义 HttpServletResponseWrapper
会让你强制执行你的行为
需要 sendError(并且可能会在内存中缓冲整个请求,以便您可以发送“回传”以处理在通常提交请求之后发生的异常)。
关于java - 错误页面返回状态代码 200 默认响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3250818/