Como especificar a página de erro padrão no web.xml?

138

Estou usando o <error-page>elemento no web.xml para especificar a página de erro amigável quando o usuário encontrar um determinado erro, como o erro com o código 404:

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

No entanto, quero que, se o usuário não encontrar nenhum código de erro especificado em <error-page>, ele ou ela deverá ver uma página de erro padrão. Como posso fazer isso usando o elemento no web.xml ?

ipkiss
fonte
2
Para qual servletcontainer você está usando / direcionando e para qual versão de servlet é web.xmldeclarada? Só existe desde o Servlet 3.0 uma maneira fácil.
BalusC
Estou usando o Tomcat 6, servlet 2.5
ipkiss

Respostas:

240

No Servlet 3.0 ou mais recente, você pode apenas especificar

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

Mas como você ainda está no Servlet 2.5, não há outra maneira senão especificar cada erro HTTP comum individualmente. Você precisa descobrir quais erros HTTP o usuário final pode enfrentar. Em um aplicativo da web barebones com, por exemplo, o uso da autenticação HTTP, com uma lista de diretórios desativada, usando servlets e códigos personalizados que podem gerar exceções sem tratamento ou que não possuem todos os métodos implementados, você gostaria de configurá-lo para erros de HTTP 401 , 403, 500 e 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>

Isso deve cobrir os mais comuns.

BalusC
fonte
Você pode especificar uma página de erro geral e substituir determinados códigos de erro pela <error-code>tag?
Qix - MONICA FOI ERRADA em
6
@ Tomas: os caras do Tomcat tiveram o mesmo problema que você. Em nenhum lugar isso é mencionado literalmente na especificação, apenas a figura 14-10 na especificação e o web.xmlarquivo XSD prova isso <error-code>e <exception-type>se tornou opcional em vez de obrigatório. Veja a edição 52135 .
precisa saber é o seguinte
java.sun.com/xml/ns/javaee/web-app_2_5.xsd não especifica nenhum filho <description> para o elemento <error-page>, portanto, colar o código acima como está em um Servlet 2.5 web.xml causará XSD erros de validação. Se eu comentá-los, porém, funciona bem, obrigado!
László van den Hoek
1
@BalusC: Onde a página general-error.html (mencionada na sua resposta) deve ser colocada dentro do WEB-INF? Eu tenho um problema estranho com o servlet 2.5, no qual, para o erro HTTP 403, criei uma definição <error-page> e a página error403.jsp fica dentro do WEB-INF e, por isso, a página error403.jsp é carregada quando qualquer É tentado acessar um dos recursos, mas as imagens e css no error403.jsp não são carregadas, fazendo com que a página pareça mal colocada.
Jayy
@ Kaipa: Basta usar caminhos relativos à URL em vez de caminhos relativos ao conteúdo da Web para recursos de CSS / JS / imagem. Muitos iniciantes pensam incorretamente que esses recursos são resolvidos no servidor, mas na verdade são resolvidos no cliente. Veja também stackoverflow.com/questions/3655316/…
BalusC
23

Você também pode fazer algo assim:

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

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

Para o código de erro 403, ele retornará a página 403.html e, para qualquer outro código de erro, retornará a página error.html.

Cara
fonte
8

Você também pode especificar <error-page>exceções usando <exception-type>, por exemplo, abaixo:

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

Ou mapeie um código de erro usando <error-code>:

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