Фильтр сервлетов url-mapping /* не работает на 404 ошибках

Я использую Resin Server & Apache 2.2 с виртуальным хостингом. Здесь я сталкиваюсь с большой проблемой при вызове конкретного фильтра. У меня есть общий класс Filter для обработки всех входящих запросов.

Например: www.example.com/hello этот привет не вызывает приведенный ниже фильтр, вместо этого он выдает ошибку "файл не найден" (404).

Если "привет" имеет правильное отображение сервлета, то работает приведенный ниже фильтр.

Web.xml:

<filter>
  <filter-name>CorpFilter</filter-name>
  <filter-class>com.filter.CorpFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CorpFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Apache Log:

[Пт Ян 04 22:05:07 2013] [ошибка] [клиент xxx.xxx.xxx.xxx] Файл не существует: /home/xxxx/public_html/hello

Почему фильтр сервлета не вызывается и выдает ошибку 404? Фильтр сервлетов инициализируется правильно.

Спасибо,

1 ответ

Фильтры по умолчанию отправляются при успешных запросах. По умолчанию они не отправляются по ошибочным запросам. Для того, чтобы отправлять их и по ошибочным запросам, расширьте сопоставление фильтров с соответствующими <dispatcher> элементы:

<filter-mapping>
    <filter-name>CorpFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

Обратите внимание, что при указании пользовательских типов диспетчера вы хотите оставить значение по умолчанию REQUEST диспетчер, тогда вы должны также явно указать это. Обратите внимание, что я также предполагаю, что 404 обрабатывается не веб-прокси (Apache HTTPD), а самим контейнером сервлета (Resin) по понятным причинам.

Другие вопросы по тегам