在Jetty 9.4.2中禁用默认错误响应正文

时间:2017-04-01 18:16:32

标签: java servlets java-ee jetty servlet-3.0

当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 个答案:

答案 0 :(得分:1)

在war文件的WEB-INF/web.xml中,指定要用于处理错误的<error-page>元素。

示例:

<?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://stackoverflow.com/a/16340504/775715

上的其他答案

答案 1 :(得分:1)

解决方案在Jetty documentation

中有所描述

为了在生成错误页面时覆盖Jetty默认行为,需要扩展ErrorHandler的类。它可以通过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());