2011-03-11 83 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

相關問題