我注意到,在 Jetty(Servlet 容器)上,默认情况下,如果出现错误,整个堆栈回溯都会发送到浏览器,这对于实时环境来说不太好。
因此,我创建了一个小“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“部署模式”,导致错误的异常在应用程序的构造函数中抛出(这似乎绕过了 Wicket 的错误处理和异常隐藏)部署模式下的回溯?)。 Wicket 口应用程序通过 <servlet>
包含在内不是<filter>
.
附注这个 Jetty 位于 Apache 后面,所以这是否是处理此问题的正确方法,或者我应该在 Apache 配置中添加一些内容,即“如果 Jetty 返回!= 200,则忽略 Jetty 返回的内容并显示此错误页面... ”
编辑:我已经更正了错误的原始原因(即应用程序现在可以正常运行,没有错误),现在我可以浏览到 http://mydomain.com/context-root/servlet-error.html ,而在此之前,如果我浏览该静态 HTML 页面,则会收到 500 错误。我看到我的 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>
最佳答案
更新:不,即使这样也行不通。现在CSS文件等如/resources/com.myapp.MyPage/styles.css
不由 Wicket 提供服务(它们以 HTML 形式返回起始页),可能是因为路径信息为空等。我讨厌它,为什么我不能只安装一个 Java 应用程序,现在将异常打印到浏览器,为什么可以这不是有效吗!?
原始答案:解决方案是将 Wicket servlet 映射替换为:
<servlet-mapping>
<servlet-name>my-app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
即更改/*
进入/
;但保留错误指令和 *.html 规则。
原因是:this answer给出 <url-pattern>
的顺序/优先级s 是匹配的(可惜 servlet 规范的链接似乎不再起作用):
- A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping.
- A string beginning with a ‘*.’ prefix is used as an extension mapping.
- A string containing only the ’/’ character indicates the "default" servlet of the application. In this case the servlet path is the request URI minus the context path and the path info is null.
- All other strings are used for exact matches only.
我需要优先遵守“match *.html”规则,而不是“将所有请求发送到 Wicket”规则。两者/*
和/
匹配所有请求,但前者为第一条规则(优先遵循*.html),后者为第三条规则(优先遵循*.html匹配)。
关于servlets - 自定义错误页面在 Jetty 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273485/