servlets - 自定义错误页面在 Jetty 中不起作用

标签 servlets jetty wicket web.xml

我注意到,在 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 规范的链接似乎不再起作用):

  1. A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping.
  2. A string beginning with a ‘*.’ prefix is used as an extension mapping.
  3. 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.
  4. All other strings are used for exact matches only.

我需要优先遵守“match *.html”规则,而不是“将所有请求发送到 Wicket”规则。两者/*/匹配所有请求,但前者为第一条规则(优先遵循*.html),后者为第三条规则(优先遵循*.html匹配)。

关于servlets - 自定义错误页面在 Jetty 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273485/

相关文章:

JavaServlet : set an instance as an attribute

java - Maven 依赖项或 Eclipse Project Facet

java - 具有默认值的 Wicket TextField

java - Servlet 应用程序 : Http session timeout

java - IDEA编译错误 Unknown version '8' ,不会给编译器任何版本设置

javax.naming.NameNotFoundException - jndiName

tomcat - 对于 Solr 安装,Servlet Container 的优点和缺点是什么?

java - Wicket:如何在 textarea 的 onkeyup 上更改标签的文本?

java - Wicket:ConverterLocato - 设置 IConverter 接口(interface)

java - 从客户端到 Java Servlet 的 GET/POST 请求出现 404 Not Found 错误