2011-03-11 114 views
2

我注意到,在Jetty(Servlet容器)上,默认情况下,如果出现错误,整个Stack回溯被发送到浏览器,这对于实时环境。自定义错误页面在Jetty中不起作用

所以我创建了一个“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>部分然后我得到的标准误差码头(有回溯),当我拥有它时,我只会在Firefox中看到一个白页,并在Chrome中显示标准的浏览器错误消息。 Jetty日志中没有错误,例如“servlet-error.html找不到”。

我已经尝试更改从/servlet-error.html/servlet-error-xxx.html的web.xml并没有任何更改(=白页,Jetty日志中没有错误)。所以我怀疑它无法通过HTML文件找到。

附加信息:应用程序使用Wicket编写,应用程序位于Wicket“部署模式”中,导致错误的异常正在应用程序的构造函数中抛出(这似乎绕过了Wicket的错误处理和隐藏部署模式中的异常回溯?)。检票申请包括在<servlet>而不是<filter>

P.S.这个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> 

我怀疑,当码头尝试执行正常请求,看到了错误,那么它试图获取servlet-error.html页面,它也可以通过使用取web.xml再次陷入试图去应用程序,这又会产生错误..大概是为了阻止无限循环,它只是显示一个空白页面的浏览器,虽然在日志中的东西会很好!

但我还是不知道正确的方式来解决这个问题是....

添加以下,但它并没有帮助。

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

回答

1

更新:没有,即使这是行不通的。现在像/resources/com.myapp.MyPage/styles.css这样的CSS文件等不是由Wicket服务的(它们返回HTML中的起始页),可能是因为路径信息为空等。我讨厌它,为什么我不能只安装一个Java应用程序,现在有例外到浏览器,为什么它不能工作!?

原来的答复:解决的办法是与替换检票servlet映射:

<servlet-mapping> 
    <servlet-name>my-app</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

即将/*更改为/;但单独留下错误指令和* .html规则。

的原因是:this answer给出的顺序/优先级,这<url-pattern> s的匹配(唉链接到Servlet规范似乎没有任何工作,更多):

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

我需要“匹配*。html的”优先于被遵守“发送所有的请求便门”规则的规则。 /*/匹配所有请求,但前者是第一条规则(服从优先于* .html),而后者是第三条规则(首选服从* .html匹配)。

1

这仅适用于Wicket应用程序构造函数中的错误吗? 由Jetty处理。

错误在Wicket页面跳转至页面,你可以在IApplicationSettings指定(在应用程序构造):

IApplicationSettings settings = getApplicationSettings(); 
settings.setAccessDeniedPage(AccessDeniedPage.class); 
settings.setPageExpiredErrorPage(PageExpiredPage.class); 
settings.setInternalErrorPage(InternalErrorPage.class); 

码头错误页面可以在web.xml文件中设置:

错误代码例如:

<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

+0

嗨,是的,这是关于由Wicket应用程序构造函数,由Jetty处理的错误。我不知道如何让Jetty在浏览器中显示自定义错误页面(例如静态HTML),而不是在浏览器中显示堆栈回溯(可能包含太多的信息,例如SQL语句或其他内容)。 – 2011-03-24 13:27:01

+0

更改我的答案包含更多信息。 – Daan 2011-03-24 15:28:47

+0

感谢您的信息。我已经试过(见问题),你知道它为什么不起作用吗? – 2011-03-25 17:50:57