java - 错误页面返回状态代码 200 默认响应

标签 java http exception servlets exception-handling

我们想实现一个“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/

相关文章:

java - 行类型 Spark 数据集的编码器

java - 仅在句子中匹配秒词(如果是 STOP 或 stop 或 StOppp)

java - 使用 DocumentBuilder.parse 解析格式良好的 XML 时如何关闭验证?

python字典键错误无法解决

node.js - Node 红色 HTTP POST 参数

java - 抛出新的异常并立即捕获它以避免代码重复。可能的?

python - 如何在 Python 中正确获取异常消息

java - 如何使用 session.setAttribute ("id", id) onclick java servlet 中的按钮?

http - 已取消请求的正确 HTTP 状态代码是什么

c++ - 类构造函数异常后清理数据