Jak określić domyślną stronę błędu w web.xml?

138

Używam <error-page>elementu w web.xml, aby określić przyjazną stronę błędu, gdy użytkownik napotka określony błąd, taki jak błąd z kodem 404:

<error-page>
        <error-code>404</error-code>
        <location>/Error404.html</location>
</error-page>

Jednak chcę, aby jeśli użytkownik nie napotkał żadnego kodu błędu określonego w <error-page>, powinien zobaczyć domyślną stronę błędu. Jak mogę to zrobić za pomocą elementu w web.xml ?

ipkiss
źródło
2
Jakiego kontenera serwletu używasz / do którego kierujesz i do jakiej wersji serwletu jest web.xmlzadeklarowany? Dopiero od Servlet 3.0 jest łatwy sposób.
BalusC
Używam Tomcat 6, servlet 2.5
ipkiss

Odpowiedzi:

240

W Servlecie 3.0 lub nowszym możesz po prostu określić

<web-app ...>
    <error-page>
        <location>/general-error.html</location>
    </error-page>
</web-app>

Ale ponieważ nadal korzystasz z Servlet 2.5, nie ma innego sposobu niż określenie każdego typowego błędu HTTP indywidualnie. Musisz dowiedzieć się, z jakimi błędami HTTP może się spotkać użytkownik końcowy. Na podstawowej aplikacji sieciowej, na przykład z wykorzystaniem uwierzytelniania HTTP, z wyłączoną listą katalogów, przy użyciu niestandardowych serwletów i kodu, który może generować nieobsłużone wyjątki lub nie ma zaimplementowanych wszystkich metod, to chcesz ustawić ją na błędy HTTP 401 , Odpowiednio 403, 500 i 503.

<error-page>
    <!-- Missing login -->
    <error-code>401</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Forbidden directory listing -->
    <error-code>403</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Missing resource -->
    <error-code>404</error-code>
    <location>/Error404.html</location>
</error-page>
<error-page>
    <!-- Uncaught exception -->
    <error-code>500</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Unsupported servlet method -->
    <error-code>503</error-code>
    <location>/general-error.html</location>
</error-page>

To powinno obejmować te najbardziej popularne.

BalusC
źródło
Czy możesz określić stronę błędu ogólnego, a następnie zastąpić niektóre kody błędów <error-code>tagiem?
Qix - MONICA BYŁA BŁĘDNA POSTĘPOWANIE STYCZNIA
6
@Tomas: Chłopaki z Tomcat mieli ten sam problem co ty. Nigdzie nie jest to dosłownie wymienione w specyfikacji, tylko rysunek 14-10 w specyfikacji web.xmldowodzi tego <error-code>i plik XSD jest <exception-type>opcjonalny, a nie wymagany. Zobacz wydanie 52135 .
BalusC
java.sun.com/xml/ns/javaee/web-app_2_5.xsd nie określa elementu podrzędnego <description> dla elementu <error-page>, więc wklejenie powyższego kodu bez zmian w serwlecie 2.5 web.xml spowoduje powstanie XSD błędy walidacji. Jeśli jednak je skomentuję, to działa dobrze, dzięki!
László van den Hoek
1
@BalusC: Gdzie w WEB-INF powinna znajdować się strona general-error.html (wspomniana w Twojej odpowiedzi)? Mam dziwny problem z serwletem 2.5, w którym dla błędu HTTP 403 utworzyłem definicję <error-page>, a strona error403.jsp znajduje się w WEB-INF iz tego powodu strona error403.jsp ładuje się, gdy jakakolwiek próbowano uzyskać dostęp do zasobów, ale obrazy i css w pliku error403.jsp nie są ładowane, przez co strona wygląda na niewłaściwie umieszczoną.
Jayy,
@Kaipa: po prostu użyj ścieżek względnych adresu URL zamiast ścieżek względnych zawartości internetowej do zasobów CSS / JS / obrazów. Wielu początkujących błędnie myśli, że te zasoby są rozwiązywane po stronie serwera, ale w rzeczywistości są to rozwiązania po stronie klienta. Zobacz także stackoverflow.com/questions/3655316/…
BalusC,
23

Możesz też zrobić coś takiego:

<error-page>
    <error-code>403</error-code>
    <location>/403.html</location>
</error-page>

<error-page>
    <location>/error.html</location>
</error-page>

Dla kodu błędu 403 zwróci stronę 403.html, a dla każdego innego kodu błędu zwróci stronę error.html.

Chłopak
źródło
8

Możesz również określić <error-page>wyjątki używając <exception-type>np. Poniżej:

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/errorpages/exception.html</location>
</error-page>

Lub zamapuj kod błędu za pomocą <error-code>:

<error-page>
    <error-code>404</error-code>
    <location>/errorpages/404error.html</location>
</error-page>
Aniket Sahrawat
źródło