在 Jetty 9.4.2 中禁用默认错误响应主体
Disable default error response body in Jetty 9.4.2
当 Jetty 捕获异常并且 return 出现错误时,如何禁用默认响应主体?我没有使用任何 XML 或 WAR 并且我不想添加任何内容。
我更愿意避免在每个 servlet 中执行 try { // Servlet code } catch (Exception e) { resp.setStatus(500) }
。
如果我不这样做,Jetty 将 return 一个 500 响应,其中包含一个指定堆栈跟踪的正文。如果到达未找到的端点,Jetty 将 return 一个 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();
}
在 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>
元素可能非常强大。
在
查看其他答案
Jetty documentation中描述了解决方案:
需要 class 扩展 ErrorHandler
以便在生成错误页面时覆盖 Jetty 默认行为。它可以通过 ContextHandler
或 Jetty 服务器注册。
CustomErrorHandler
class:
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());
当 Jetty 捕获异常并且 return 出现错误时,如何禁用默认响应主体?我没有使用任何 XML 或 WAR 并且我不想添加任何内容。
我更愿意避免在每个 servlet 中执行 try { // Servlet code } catch (Exception e) { resp.setStatus(500) }
。
如果我不这样做,Jetty 将 return 一个 500 响应,其中包含一个指定堆栈跟踪的正文。如果到达未找到的端点,Jetty 将 return 一个 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();
}
在 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>
元素可能非常强大。
在
查看其他答案Jetty documentation中描述了解决方案:
需要 class 扩展 ErrorHandler
以便在生成错误页面时覆盖 Jetty 默认行为。它可以通过 ContextHandler
或 Jetty 服务器注册。
CustomErrorHandler
class:
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());