сеть.страница ошибки xml не отфильтрована


Мое приложение работает на Tomcat 7.

Я создал фильтр перезаписи url, который прослушивает все входящие запросы, но при запуске страницы с ошибкой он не фильтрует ее, а фильтрует страницу, на которой произошла ошибка.

Я устанавливаю точку останова в фильтре, и когда возникает ошибка, вы можете увидеть ее триггеры на исходной странице. Но отображаемая Страница /desktop/index.xhtml

Является ли это ожидаемым поведением ?

Вот мой web.xml конфигурация:

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<error-page>
    <error-code>500</error-code>
    <location>/desktop/index.xhtml?messageId=4</location>
</error-page>
1 2

1 ответ:

является ли это ожидаемым поведением ?

Да.

Фильтры

По умолчанию отображаются только на диспетчере REQUEST. Ниже

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Эквивалентно

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
Это означает, что фильтр срабатывает только на "сырой" входящий запрос, а не на переадресованный запрос или запрос страницы ошибок. Есть еще два диспетчера: FORWARD и ERROR. Страницы ошибок внутренне отправляются через диспетчер ERROR. Если вы позволите ... ваш фильтр также зацепится за это, а затем добавьте его:
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
Обратите внимание, что здесь необходимо явно указать диспетчер REQUEST, в противном случае предполагается, что вы полностью его переопределяете и интересуетесь только диспетчером ERROR.

Внутри фильтра вы можете проверить наличие атрибута запроса с ключом RequestDispatcher#ERROR_REQUEST_URI был ли он вызван или нет.

String errorRequestURI = (String) request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);

if (errorRequestURI != null) {
    // Error page was triggered on the given URI.
}