2015-01-19 3 views
2

Мое приложение работает на Tomcat 7.web.xml не фильтруется

Я создал URL Rewrite фильтр, который прослушивает всех входящих запросов, но, когда страница ошибки запускается, Безразлично» t фильтрует его, вместо этого он фильтрует страницу, на которой произошла ошибка.

Я установил точку останова в фильтре и, когда возникла ошибка, вы можете увидеть, что она запускается на исходной странице. Но отображается страница /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> 

ответ

7

Это ожидаемое поведение?

Да.

Фильтры по умолчанию отображаются на диспетчере 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> 

Это означает, что фильтр срабатывает только на «сырой» входящем запросе, а не на пересланном запросе или запросе страницы ошибки.

Есть еще 2 диспетчера: 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. 
} 
+0

Отличный ответ, большое спасибо BalusC! – madgangmixers

Смежные вопросы