我注意到,在Jetty(Servlet容器)上,默认情况下,如果出现错误,整个Stack回溯会被发送到浏览器,这对于实时环境来说不太好。
所以我创建了一个小的“servlet-error.html”文件,并将其包含在我的Web应用程序中,并从web.xml中引用它。
我的web.xml看起来像:
<web-app>
..
<error-page>
<error-code>500</error-code>
<location>/servlet-error.html</location>
</error-page>
<error-page>
<error-code>503</error-code>
<location>/servlet-error.html</location>
</error-page>
</web-app>
WAR文件如下所示:
servlet-error.html
WEB-INF/web.xml
...
当我没有<error-page>
部分时,我得到标准的Jetty错误(使用回溯),当我拥有它然后我只是在Firefox中获得一个白页,并在Chrome中出现标准的浏览器错误消息。 Jetty日志中没有错误,例如“无法找到servlet-error.html”。
我尝试将web.xml从/servlet-error.html
更改为/servlet-error-xxx.html
并且没有更改(=白页,Jetty日志中没有错误)。所以我怀疑它无法通过HTML文件找到。
附加信息:应用程序是用Wicket编写的,应用程序处于Wicket“部署模式”,导致错误的异常被抛出在Application的构造函数中(这似乎绕过了Wicket的错误处理和隐藏异常)在部署模式下回溯?)。 wicket应用程序通过<servlet>
而不是<filter>
包含在内。
P.S。这个Jetty是Apache的后面,所以这甚至是处理这个问题的正确方法,或者我应该向Apache配置添加一些内容,即“如果Jetty返回!= 200然后忽略Jetty返回的内容,而是显示此错误页面... “
编辑:我已更正错误的原始原因(即应用程序现在正常运行)现在我可以浏览http://mydomain.com/context-root/servlet-error.html,而在此之前我会收到500错误如果我浏览到那个静态HTML页面。我看到我的web.xml中有:
<servlet-mapping>
<servlet-name>my-app</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
我怀疑,当Jetty尝试执行正常请求时,会看到错误,然后它会尝试获取servlet-error.html
页面,它也会使用web.xml
获取,该页面再次尝试转到应用程序,再次生成错误..并且可能是为了停止无限循环,它只是向浏览器显示一个空白页面,虽然日志中的某些内容会很好!
但我仍然不确定解决问题的正确方法是什么......
我添加了以下内容,但没有帮助。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
答案 0 :(得分:1)
更新:不,即使这不起作用。现在,Wicket不提供像/resources/com.myapp.MyPage/styles.css
这样的CSS文件(它们以HTML格式返回起始页),可能是因为路径信息为null等等。我讨厌它,为什么我不能只安装Java应用程序和现在有例外打印到浏览器,为什么它不能正常工作!?
原始回答:解决方案是用以下代码替换Wicket servlet映射:
<servlet-mapping>
<servlet-name>my-app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
即。将/*
更改为/
;但只留下错误指令和* .html规则。
原因是:this answer给出<url-pattern>
匹配的顺序/优先级(唉,servlet规范的链接似乎不再起作用):
- 以“/”字符开头并以“/ *”后缀结尾的字符串用于路径映射。
- 以'*。'前缀开头的字符串用作扩展名映射。
- 仅包含'/'字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为空。
- 所有其他字符串仅用于完全匹配。
醇>
我需要遵守“匹配* .html”规则,而不是“向Wicket发送所有请求”规则。 /*
和/
都匹配所有请求,但前者是第一个规则(优先服从* .html),而后者是第三个规则(* .html匹配优先服从)
答案 1 :(得分:1)
这仅适用于Wicket应用程序构造函数中的错误吗? 这是由Jetty处理的。
Wicket页面中的错误转到您可以在IApplicationSettings中指定的页面(在应用程序构造函数中):
IApplicationSettings settings = getApplicationSettings();
settings.setAccessDeniedPage(AccessDeniedPage.class);
settings.setPageExpiredErrorPage(PageExpiredPage.class);
settings.setInternalErrorPage(InternalErrorPage.class);
可以在web.xml文件中设置Jetty错误页面:
错误代码示例:
<error-page>
<error-code>404</error-code>
<location>/jspsnoop/ERROR/404</location>
</error-page>
例外情况:
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/jspsnoop/IOException</location>
</error-page>
来源:Jetty Wiki