2013-04-20 37 views
6

當會話過期時,JSF應用程序可能會拋出ViewExpiredException。當您的系統上有客人時,此事件將非常常見。爲此,應用程序將處理這個事件,而不對客人有任何問題,具體如下:ViewExpiredException由錯誤頁面處理,仍在日誌中

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/expired</location> 
</error-page> 

當客人試圖在一個過期的會話發送一個請求,他將被重定向到/expired。由於我不認爲這個Exception是值得一提的問題,所以我想阻止將stacktrace寫入我的應用程序服務器的日誌。

我該如何做到這一點?

回答

7

基本上有兩個選項可以歸結爲相同的解決方案:使用servlet filter或JSF exception handler自己捕捉,壓縮並導航到錯誤頁面。這樣,異常將不會到達servletcontainer,然後它會自動處理並記錄它。

假設錯誤頁面確實爲您完成了工作(這不適用於JSF ajax請求,除非您有自定義JSF ExceptionHandler),那麼映射到URL模式匹配JSF請求的servlet過濾器在其doFilter()方法以下就足夠了:

try { 
    chain.doFilter(request, response); 
} catch (ServletException e) { 
    if (e.getRootCause() instanceof ViewExpiredException) { 
     request.getRequestDispatcher("/expired").forward(request, response); 
    } else { 
     throw e; 
    } 
} 

如果你想覆蓋JSF Ajax請求爲好,那麼你就不能圍繞一個JSF異常處理程序去。頭以下的相關答案,看看一些具體的例子: