Comment spécifier la page d'erreur par défaut dans web.xml?

138

J'utilise un <error-page>élément dans web.xml pour spécifier la page d'erreur conviviale lorsque l'utilisateur rencontre une certaine erreur telle qu'une erreur avec le code 404:

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

Cependant, je veux que si l'utilisateur ne rencontre aucun code d'erreur spécifié dans <error-page>, il ou elle devrait voir une page d'erreur par défaut. Comment puis-je faire cela en utilisant l'élément dans le fichier web.xml ?

ipkiss
la source
2
Quel servletcontainer utilisez-vous / ciblez-vous et quelle version de servlet est-elle web.xmldéclarée? Depuis Servlet 3.0, il n'y a qu'un moyen simple.
BalusC
J'utilise Tomcat 6, servlet 2.5
ipkiss

Réponses:

240

Sur Servlet 3.0 ou plus récent, vous pouvez simplement spécifier

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

Mais comme vous êtes toujours sur Servlet 2.5, il n'y a pas d'autre moyen que de spécifier chaque erreur HTTP courante individuellement. Vous devez déterminer les erreurs HTTP auxquelles l'utilisateur final pourrait être confronté. Sur une application Web barebones avec, par exemple, l'utilisation de l'authentification HTTP, une liste de répertoires désactivée, l'utilisation de servlets et de code personnalisés pouvant éventuellement générer des exceptions non gérées ou ne disposant pas de toutes les méthodes implémentées, vous souhaitez le définir pour les erreurs HTTP 401 , 403, 500 et 503 respectivement.

<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>

Cela devrait couvrir les plus courants.

BalusC
la source
Pouvez-vous spécifier une page d'erreur générale, puis remplacer certains codes d'erreur avec la <error-code>balise?
Qix - MONICA a été égaré le
6
@Tomas: Les gars de Tomcat ont eu le même problème que vous. Ceci n'est littéralement mentionné nulle part dans la spécification, seule la figure 14-10 dans la spécification et le web.xmlfichier XSD le prouve <error-code>et <exception-type>est devenu optionnel au lieu d'être obligatoire. Voir le numéro 52135 .
BalusC
java.sun.com/xml/ns/javaee/web-app_2_5.xsd ne spécifie aucun enfant <description> pour l'élément <error-page>, donc coller le code ci-dessus tel quel dans un servlet 2.5 web.xml provoquera XSD erreurs de validation. Si je les commente, cela fonctionne bien, merci!
László van den Hoek
1
@BalusC: Où la page general-error.html (mentionnée dans votre réponse) doit-elle être placée, dans WEB-INF? J'ai un problème étrange avec le servlet 2.5 dans lequel, pour l'erreur HTTP 403, j'ai créé une définition <error-page> et la page error403.jsp se trouve à l'intérieur du WEB-INF et à cause de cela, la page error403.jsp se charge quand une des ressources sont essayées d'accéder mais les images et les css dans l'erreur403.jsp ne sont pas chargées, ce qui rend la page mal placée.
Jayy
@Kaipa: Utilisez simplement des chemins relatifs aux URL au lieu des chemins relatifs au contenu Web vers les ressources CSS / JS / image. Beaucoup de démarreurs pensent à tort que ces ressources sont résolues côté serveur, mais elles sont en fait résolues côté client. Voir aussi stackoverflow.com/questions/3655316/…
BalusC
23

Vous pouvez également faire quelque chose comme ça:

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

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

Pour le code d'erreur 403, il renverra la page 403.html et pour tout autre code d'erreur, il renverra la page error.html.

Gars
la source
8

Vous pouvez également spécifier <error-page>des exceptions en utilisant <exception-type>, par exemple ci-dessous:

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

Ou mappez un code d'erreur en utilisant <error-code>:

<error-page>
    <error-code>404</error-code>
    <location>/errorpages/404error.html</location>
</error-page>
Aniket Sahrawat
la source