В каком порядке будут вызываться фильтры?

Предположим, у меня есть следующие данные в моем web.xml

<filter-mapping>
    <filter-name>F1</filter-name>
    <url-pattern>/XYZ/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>F2</filter-name>
    <url-pattern>/XYZ/abc.do</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>F3</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

В каком порядке будут вызываться фильтры, если запрос придет как /XYZ/abc.do. И почему?


person Xyzxyz Xyz    schedule 29.10.2011    source источник


Ответы (2)


В том порядке, в котором их сопоставления определены в web.xml.

При использовании аннотаций (@WebFilter) порядок кажется неопределенным — вам все равно нужно объявить <filter-mapping> записей в файле web.xml.

person Bozho    schedule 29.10.2011
comment
так что это F1, F2, F3? Что, если в случае сервлета? скажем, у меня есть 1 шаблон, соответствующий 2 сервлетам? - person Xyzxyz Xyz; 29.10.2011
comment
не имеет значения, сколько сервлетов/урисов он соответствует. Текущий целевой ресурс только один, и для него фильтры вызываются в порядке объявления сопоставления. (Так что да - F1,F2,F3) - person Bozho; 29.10.2011
comment
да, я понял. Но теперь я спрашиваю о совершенно отдельном сценарии, где один и тот же URL-адрес соответствует двум разным сервлетам s1 и s2. Какой сервлет будет вызываться? Этот вопрос не зависит от фильтров. - person Xyzxyz Xyz; 29.10.2011
comment
если он независимый, задайте другой вопрос;) (и отметьте ответ как принятый на этот) - person Bozho; 29.10.2011
comment
готово............................................... : ).Можете ли вы прокомментировать сейчас? - person Xyzxyz Xyz; 29.10.2011
comment
задав другой вопрос я имел в виду нажать кнопку Задать вопрос и сформулировать новый вопрос - person Bozho; 29.10.2011
comment
сделано stackoverflow.com/questions/ 7938138/ - person Xyzxyz Xyz; 29.10.2011

Раздел 6.2.4 спецификации сервлета 3.0:

При обработке элемента <filter-mapping> с использованием стиля <url-pattern> контейнер должен определить, соответствует ли <url-pattern> URI запроса, используя правила отображения пути, определенные в Главе 12, «Отображение запросов в сервлеты».

Порядок, который контейнер использует при построении цепочки фильтров, применяемых к конкретному URI запроса, следующий:

  1. Во-первых, сопоставления <url-pattern> сопоставления фильтров в том же порядке, в котором эти элементы появляются в дескрипторе развертывания.

  2. Затем <servlet-name> сопоставления соответствующих фильтров в том же порядке, в котором эти элементы появляются в дескрипторе развертывания.

Если сопоставление фильтра содержит как <servlet-name>, так и <url-pattern>, контейнер должен расширить сопоставление фильтра на несколько сопоставлений фильтров (по одному для каждого <servlet-name> и <url-pattern>), сохраняя порядок элементов <servlet-name> и <url-pattern>.

Короче говоря: они применяются в том порядке, в котором они появляются в файле XML. Становится интересным, если вы нажмете URL-адрес, на который распространяются как связанные фильтры <url-pattern>, так и <servlet-name>, потому что тогда все связанные фильтры URL-шаблона применяются перед всеми связанными фильтрами имени сервлета. Я никогда не был в такой ситуации (вообще не видел никаких фильтров, связанных с именами сервлетов), но я считаю, что это может быть довольно запутанным.

person Barend    schedule 29.10.2011