Java 如何删除“;由「;在码头9.2.x
我正在尝试实现一个定制的errorhandler,并在/webapp/web-INF中使用jetty-web.xml,它运行良好Java 如何删除“;由「;在码头9.2.x,java,jetty,Java,Jetty,我正在尝试实现一个定制的errorhandler,并在/webapp/web-INF中使用jetty-web.xml,它运行良好 <Configure class="org.eclipse.jetty.server.handler.ContextHandler"> <Set name="errorHandler"> <New class="com.example.CustomErrorHandler" /> </Set> &
<Configure class="org.eclipse.jetty.server.handler.ContextHandler">
<Set name="errorHandler">
<New class="com.example.CustomErrorHandler" />
</Set>
</Configure>
那么,为什么jetty.xml中没有激活自定义处理程序呢
编辑:使用jetty 9.2.19.v20160908
注:Jetty 9.2.x是EOL(寿命终止)-使用更新的Jetty支持/稳定版本。
存在一种配置,可以从默认错误页面中删除Jetty供电的(以及HTTP响应头中的服务器头)
这是HttpConfiguration.setSendServerVersion(false)
设置
无需创建自定义错误处理程序
或任何复杂的操作
HttpConfiguration
位于设置为绑定到端口并接受传入连接的ServerConnector
中
如果您在${jetty.base}
目录中使用了适当的${jetty.home}
(),则可以使用属性为所有${jetty.home}
附带的${ServerConnector
配置配置此设置
举个例子
让我们设置一个简单的${jetty.base}
,它足以演示
[tmp]$mkdir未提供基础
[tmp]$cd未提供基础/
[noprovided base]$java-jar~/jetty-home-9.4.22.v20191022/start.jar\
--创建startd\
--添加到start=http、deploy、webapp
MKDIR:${jetty.base}/start.d
信息:webapp在${jetty.base}/start.d/webapp.ini中初始化
信息:服务器已过渡启用,ini模板可与--add to start=server一起使用
信息:安全性可传递启用
信息:可传递地启用servlet
信息:http在${jetty.base}/start.d/http.ini中初始化
信息:线程池已过渡启用,ini模板可与--add to start=threadpool一起使用
信息:bytebufferpool已过渡启用,ini模板可与--add to start=bytebufferpool一起使用
信息:部署在${jetty.base}/start.d/deploy.ini中初始化
MKDIR:${jetty.base}/webapps
信息:基本目录已修改
[未提供基础]$ls-la
总数16
drwxr-xr-x 4 joakim joakim 4096 11月13日08:09/
drwxr-xr-x 13 joakim joakim 4096 11月13日08:08/
drwxr-xr-x 2 joakim joakim 4096 11月13日08:09开始d/
drwxr-xr-x 2 joakim joakim 4096 11月13日08:09网络应用/
现在让我们运行这个基本默认/未配置的${jetty.base}
[noprovided base]$java-jar~/jetty-home-9.4.22.v20191022/start.jar
2019-11-13 08:12:28.248:INFO::main:Logging在379ms时初始化为org.eclipse.jetty.util.log.StdErrLog
2019-11-13 08:12:28.467:信息:oejs.服务器:main:jetty-9.4.22.v20191022;建成时间:2019-10-22T13:37:13.455Z;git:B1E6B5512E008F7FBDF1CBEA4 FF8A6446D1073B;jvm 11.0.5+10
2019-11-13 08:12:28.480:信息:oejdp.ScanningAppProvider:main:部署监视器[file:///home/joakim/tmp/noprovided-base/webapps/]间隔1
2019-11-13 08:12:28.503:信息:oejs.AbstractConnector:main:已启动ServerConnector@48ebde5e{HTTP/1.1[HTTP/1.1]}{0.0.0.0:8080}
2019-11-13 08:12:28.504:INFO:oejs.Server:main:Started@634ms
并查看它生成的错误消息(和响应头)的类型
[tmp]$curl-vvhttp://localhost:8080/flarg
*正在尝试::1。。。
*TCP_节点集
*已连接到本地主机(::1)端口8080(#0)
>GET/flarghttp/1.1
>主机:本地主机:8080
>用户代理:curl/7.58.0
>接受:*/*
>
未找到
是的,由Jetty://9.4.22.v20191022提供动力的响应体页脚和服务器:Jetty(9.4.22.v20191022)
页眉存在
现在让我们配置这个${jetty.base}
来禁用版本报告
[noprovided base]$echo“jetty.httpConfig.sendServerVersion=false”>>start.ini
[未提供基础]$cat start.ini
jetty.httpConfig.sendServerVersion=false
一次重新启动服务器,另一次测试显示
[tmp]$curl-vvhttp://localhost:8080/flarg
*正在尝试::1。。。
*TCP_节点集
*已连接到本地主机(::1)端口8080(#0)
>GET/flarghttp/1.1
>主机:本地主机:8080
>用户代理:curl/7.58.0
>接受:*/*
>
未找到
由
响应正文页脚和
服务器
响应页眉提供动力的现在消失
在您的Jetty版本(9.2.18.v20160721)中,“由Jetty供电”存在于5个不同的位置(ContextHandler
,DefaultHandler
,HttpSpiContextHandler
,响应
,最后是ErrorHandler
)。如果您使用的是独立的Jetty服务器,则始终存在4个
使用旧版本的Jetty无法删除所有这些引用
这是通过Jetty 9.3.0代码库上的多次提交解决的
最后的承诺是
您必须使用Jetty 9.3.0(或更新版本)才能从Jetty生成的各种响应中删除这些引用。我看到提到了Jetty web.xml
和/webapp/web-INF
,这是用于实际的WAR/webapp吗?还有,你的最终目标是什么,你想达到什么?(自定义ErrorHandler
通常适用于那些希望管理非上下文错误的人,这与您通过jetty web.xml
使用它的努力相反)我的目标是从默认错误页面中删除“由jetty供电”。是的,jetty-web.xml使用cutsom错误调用jar
<Configure id="Server" class="org.eclipse.jetty.server.Server">
...
<Call name="addBean">
<Arg>
<New class="com.example.CustomErrorHandler"/>
</Arg>
</Call>
</Configure>
public class CustomErrorHandler extends ErrorHandler {
public CustomErrorHandler() {
super.setShowMessageInTitle(false);
super.setShowStacks(false);
}
@Override
protected void writeErrorPageBody(final HttpServletRequest request, final Writer writer, final int code,
final String message, final boolean showStacks) throws IOException {
final String uri = request.getRequestURI();
writeErrorPageMessage(request, writer, code, message, uri);
if (showStacks) {
writeErrorPageStacks(request, writer);
}
}
}