Как указать страницу ошибки по умолчанию в web.xml?

138

Я использую <error-page>элемент в web.xml, чтобы указать дружественную страницу ошибки, когда пользователь сталкивается с определенной ошибкой, такой как ошибка с кодом 404:

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

Тем не менее, я хочу, чтобы, если пользователь не встречал код ошибки, указанный в нем <error-page>, он или она должен видеть страницу ошибки по умолчанию. Как я могу сделать это, используя элемент в web.xml ?

ipkiss
источник
2
Какой сервлетконтейнер вы используете / таргетируете и какую версию сервлета вы web.xmlобъявили? Там только с Servlet 3.0 легкий путь.
BalusC
Я использую Tomcat 6, сервлет 2.5
ipkiss

Ответы:

240

На Servlet 3.0 или новее вы можете просто указать

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

Но, поскольку вы все еще используете Servlet 2.5, нет другого способа, кроме индивидуальной настройки каждой распространенной ошибки HTTP. Вам необходимо выяснить, с какими ошибками HTTP может столкнуться конечный пользователь. В простом веб-приложении, например, с использованием HTTP-аутентификации, с отключенным списком каталогов, с использованием пользовательских сервлетов и кода, который может генерировать необработанные исключения или не имеет всех реализованных методов, вы можете установить его для ошибок HTTP 401 403, 500 и 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>

Это должно охватывать наиболее распространенные из них.

BalusC
источник
Можете ли вы указать общую страницу ошибок, а затем переопределить определенные коды ошибок <error-code>тегом?
Qix - МОНИКА ПРОИЗОШЛА
6
@ Томас: У парней Tomcat была та же проблема, что и у вас. Это нигде буквально не упоминается в спецификации, только рисунок 14-10 в спецификации, и web.xmlфайл XSD доказывает это <error-code>и <exception-type>стал необязательным, а не обязательным. Смотрите выпуск 52135 .
BalusC
java.sun.com/xml/ns/javaee/web-app_2_5.xsd не указывает дочерний элемент <description> для элемента <error-page>, поэтому вставка приведенного выше кода в файл Servlet 2.5 «как есть» вызовет XSD ошибки проверки. Если я их прокомментирую, то все работает нормально, спасибо!
Ласло ван ден Хук
1
@BalusC: Где должна быть размещена страница general-error.html (упомянутая в вашем ответе) внутри WEB-INF? У меня есть странная проблема с сервлетом 2.5, в которой для ошибки HTTP 403 я создал определение <error-page>, и страница error403.jsp находится внутри WEB-INF, и из-за этого страница error403.jsp загружается, когда любой из ресурсов пытаются получить доступ, но изображения и CSS внутри error403.jsp не загружаются, что делает страницу неуместной.
Jayy
@Kaipa: просто используйте относительные URL-адреса вместо относящихся к веб-контенту путей к ресурсам CSS / JS / image. Многие начинающие ошибочно считают, что эти ресурсы разрешаются на стороне сервера, но на самом деле они разрешаются на стороне клиента. Смотрите также stackoverflow.com/questions/3655316/...
BalusC
23

Вы также можете сделать что-то подобное:

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

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

Для кода ошибки 403 он вернет страницу 403.html, а для любого другого кода ошибки - страницу error.html.

парень
источник
8

Вы также можете указать <error-page>исключения, используя <exception-type>, например, ниже:

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

Или сопоставьте код ошибки, используя <error-code>:

<error-page>
    <error-code>404</error-code>
    <location>/errorpages/404error.html</location>
</error-page>
Аникет Сахрават
источник