禁用 Tomcat 中的所有默认 HTTP 错误响应内容

2022-08-31 13:50:09

默认情况下,如果 Tomcat 遇到类似 HTTP 404 的内容,它会将一些 HTML 内容发送回客户端。我知道通过一个可以配置来自定义此内容。web.xml<error-page>

但是,我只是希望Tomcat在响应内容方面不发送任何内容(当然,我仍然喜欢状态代码)。有没有办法轻松配置它?

我试图避免A)从我的Servlet在响应流上显式发送空内容,以及B)为我的一大堆HTTP错误状态配置自定义错误页面。web.xml

对于一些背景,我正在开发一个HTTP API,并控制我自己的响应内容。例如,对于 HTTP 500,我在包含错误信息的响应中填充一些 XML 内容。对于像HTTP 404这样的情况,HTTP响应状态对于客户端来说已经足够了,tomcat发送的内容是不必要的。如果有其他方法,我愿意听。

编辑:经过持续的调查,我仍然找不到太多的解决方案。如果有人可以明确地说这是不可能的,或者提供一个资源来证明它不会起作用,我会接受这个答案,并尝试解决这个问题。


答案 1

如果你不希望 tomcat 显示错误页面,那么不要使用 sendError(...)。而是使用 setStatus(...)。

例如,如果您想给出405响应,那么您确实

response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);      
response.getWriter().println("The method " + request.getMethod() + 
   " is not supported by this service.");

还要记住不要从你的 servlet 中抛出任何异常。相反,请捕获异常,并再次设置状态编码你自己。

protected void service(HttpServletRequest request,
      HttpServletResponse response) throws IOException {
  try {

    // servlet code here, e.g. super.service(request, response);

  } catch (Exception e) {
    // log the error with a timestamp, show the timestamp to the user
    long now = System.currentTimeMillis();
    log("Exception " + now, e);
    response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    response.getWriter().println("Guru meditation: " + now);
  }
}

当然,如果你不想要任何内容,那么就不要给作者写任何东西,只需设置状态即可。


答案 2

虽然这并不能完全回应关于这个问题的“不发送任何东西”的陈述,并且在Clive Evans的答案浪潮中,我发现在tomcat中,你可以让那些太多冗长的文本从错误页面中消失,而无需创建自定义的ErrorReportValve。

您可以通过“服务器”上的2个参数“showReport”和“showServerInfo”来完成此自定义ErrorReportValve.xml:

<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />

链接到官方文档

在tomcat 7.0.55上为我工作,在tomcat 7.0.47上为我工作(我想是因为以下链接上报告了一些 http://www.mail-archive.com/users@tomcat.apache.org/msg113856.html)


推荐