¿Cómo especificar la página de error predeterminada en web.xml?

138

Estoy usando el <error-page>elemento en web.xml para especificar la página de error amigable cuando el usuario encuentra un cierto error, como un error con el código 404:

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

Sin embargo, quiero que si el usuario no cumple con el código de error especificado <error-page>, debería ver una página de error predeterminada. ¿Cómo puedo hacer eso usando el elemento en web.xml ?

ipkiss
fuente
2
¿Qué servletcontainer estás usando / apuntando y a qué versión de servlet estás web.xmldeclarado? Solo desde Servlet 3.0 es fácil.
BalusC
Estoy usando Tomcat 6, servlet 2.5
ipkiss

Respuestas:

240

En Servlet 3.0 o posterior, solo podría especificar

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

Pero como todavía está en Servlet 2.5, no hay otra forma que especificar cada error HTTP común individualmente. Debe averiguar qué errores HTTP podría enfrentar el usuario final. En una aplicación web barebones con, por ejemplo, el uso de autenticación HTTP, tener una lista de directorios deshabilitada, usar servlets personalizados y código que posiblemente puede generar excepciones no controladas o no tiene todos los métodos implementados, entonces le gustaría configurarlo para errores HTTP 401 , 403, 500 y 503 respectivamente.

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

Eso debería cubrir los más comunes.

BalusC
fuente
¿Puede especificar una página de error general y luego anular ciertos códigos de error con la <error-code>etiqueta?
Qix - MONICA FUE MALTRATADA el
66
@Tomas: los chicos de Tomcat tenían el mismo problema que tú. Esto en ninguna parte se menciona literalmente en las especificaciones, solo la figura 14-10 en las especificaciones y el web.xmlarchivo XSD lo demuestra <error-code>y se <exception-type>convirtió en opcional en lugar de obligatorio. Ver número 52135 .
BalusC
java.sun.com/xml/ns/javaee/web-app_2_5.xsd no especifica ningún elemento secundario <description> para el elemento <error-page>, por lo que pegar el código anterior tal como está en un Servlet 2.5 web.xml causará XSD errores de validación Sin embargo, si los comento, funciona bien, ¡gracias!
László van den Hoek
1
@BalusC: ¿Dónde debe colocarse la página general-error.html (mencionada en su respuesta), dentro de WEB-INF? Tengo un problema extraño con el servlet 2.5 en el que para el error HTTP 403, he creado una definición de <página de error> y la página error403.jsp se encuentra dentro del WEB-INF y debido a esto la página error403.jsp se carga cuando hay alguna se intenta acceder a los recursos, pero las imágenes y css dentro del error403.jsp no se cargan, lo que hace que la página se vea fuera de lugar.
Jayy
@Kaipa: solo use rutas relativas a URL en lugar de rutas relativas a contenido web a CSS / JS / recursos de imagen. Muchos principiantes piensan incorrectamente que esos recursos se resuelven del lado del servidor, pero en realidad se resuelven del lado del cliente. Ver también stackoverflow.com/questions/3655316/…
BalusC
23

También puedes hacer algo así:

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

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

Para el código de error 403 devolverá la página 403.html, y para cualquier otro código de error devolverá la página error.html.

Chico
fuente
8

También puede especificar <error-page>excepciones utilizando <exception-type>, por ejemplo, a continuación:

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

O mapear un código de error usando <error-code>:

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