禁用Jetty 9.4.2中的默认错误响应体。

3
如何禁用Jetty捕获异常并返回错误时的默认响应体?我没有使用任何XML或WAR,也不想添加任何内容。我希望避免在每个servlet中执行“try { // Servlet code } catch (Exception e) { resp.setStatus(500) }”操作。如果我不这样做,Jetty将返回一个500响应,并指定堆栈跟踪的响应体。如果到达未找到的端点,Jetty将返回一个404响应,并显示“Powered by Jetty”的响应体。我想删除这些响应体,只保留响应代码。以下是启动Jetty服务器的代码:
private static void startServer() throws Exception {
    final org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(7070);
    final WebAppContext context = new WebAppContext("/", "/");
    context.setConfigurations(new Configuration[] { new AnnotationConfiguration(), new WebInfConfiguration() });
    context.setExtraClasspath("build/classes/main/com/example");
    server.setHandler(context);
    server.start();
    server.join();
}
2个回答

3
解决方案在Jetty文档中有描述:
需要一个扩展ErrorHandler类的类,以便在生成错误页面时覆盖Jetty的默认行为。它可以通过ContextHandler或Jetty服务器进行注册。 CustomErrorHandler类:
public class CustomErrorHandler extends ErrorHandler {

    @Override
    protected void writeErrorPage(HttpServletRequest request, Writer writer, int code, String message, boolean showStacks) throws IOException {}
}

我随后将以下内容添加到我的Jetty嵌入式配置中: context.setErrorHandler(new CustomErrorHandler()); 其中,CustomErrorHandler是自定义的错误处理程序。

如果您要将此内容添加到WebAppContext中,则需要扩展ErrorPageErrorHandler,而不是ErrorHandler(因为它适用于非上下文和服务器端错误)。 - Joakim Erdfelt

1
在您的war文件的WEB-INF/web.xml中,指定要用于处理错误的元素。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <servlet>
    <servlet-name>myerror</servlet-name>
    <servlet-class>com.company.MyErrorServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>myerror</servlet-name>
    <url-pattern>/myerror</url-pattern>
  </servlet-mapping>

  <error-page>
    <location>/myerror</location>
  </error-page>
</web-app>
<error-page>元素非常强大。
请参见https://dev59.com/7nHYa4cB1Zd3GeqPNZ_r#16340504上的其他答案。

1
我没有使用任何XML或WAR文件,只是为Servlet使用注解。是否有编程解决方案?在您的解决方案中,每个错误(500、404等)都会转到同一个MyErrorServlet吗?我想返回相同的错误代码,但不带有泄露数据的Jetty响应正文。 - user1183772
你正在使用 WebAppContext 表示你正在使用 war(它可以是一个 exploded directory)。你不能使用注释指定 error-page(没有相应的注释),必须使用 WEB-INF/web.xml。请参考其他答案以了解错误分派和有关错误状态的属性。 - Joakim Erdfelt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接