2013-04-20 24 views
6

Aplikacje JSF mogą wyrzucać ViewExpiredException s po zakończeniu sesji. Wydarzenie to będzie dość powszechne, gdy w systemie będą goście. Nich aplikacja będzie obsługiwać to wydarzenie bez kłopotów dla gościa, jak następuje:ViewExpiredException obsługiwany przez stronę błędów, nadal w dzienniku

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

Kiedy gość próbuje wysłać wniosek na sesji ważność, zostanie on przekierowany do /expired. Ponieważ nie uważam tego Exception za problem, o którym warto wspomnieć, chciałbym zapobiec zapisywaniu stosu śledzenia w dzienniku mojego serwera aplikacji.

Jak mogę to zrobić?

Odpowiedz

7

Istnieją zasadniczo dwie opcje, z których każda sprowadza się do tego samego rozwiązania: przechwytuj, ukryj i przejdź do strony błędu samodzielnie, używając albo servlet filter lub JSF exception handler. W ten sposób wyjątek nie dotrze do kontenera servletcontainer, który następnie będzie go obsługiwał i logował automatycznie.

Pod warunkiem, że strona z informacją o błędzie rzeczywiście spełnia twoje zadanie (to znaczy, że nie będzie działać z żądaniami JSF ajax, chyba że masz niestandardowy JSF ExceptionHandler), to filtr serwletów jest odwzorowany na wzór adresu URL pasujący do żądań JSF, następujące w jego metodzie doFilter() powinno wystarczyć:

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

Jeśli chcesz na pokrycie żądań JSF ajax jak dobrze, to nie można przejść wokół JSF obsługi wyjątków. Głowa do następujących powiązanych odpowiedzi zobaczyć jakieś konkretne przykłady: