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

时间:2011-03-11 13:28:57

标签: servlets jetty wicket web.xml

我注意到,在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>

2 个答案:

答案 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规范的链接似乎不再起作用):

  
      
  1. 以“/”字符开头并以“/ *”后缀结尾的字符串用于路径映射。
  2.   
  3. 以'*。'前缀开头的字符串用作扩展名映射。
  4.   
  5. 仅包含'/'字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为空。
  6.   
  7. 所有其他字符串仅用于完全匹配。
  8.   

我需要遵守“匹配* .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