Фильтры по умолчанию отображаются только на диспетчере REQUEST
. Приведенный ниже пример сопоставления фильтра
<filter-mapping>
<filter-name>yourFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
неявно эквивалентен
<filter-mapping>
<filter-name>yourFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Это означает, что фильтр срабатывает только по «сырому» входящему запросу, а не по перенаправленному запросу. .
Есть еще три диспетчера: FORWARD
, INCLUDE
и ERROR
. RequestDispatcher#forward()
запускает диспетчер FORWARD
. Если вы хотите, чтобы ваш фильтр также подключился к этому, просто добавьте его:
<filter-mapping>
<filter-name>yourFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
Обратите внимание, что вам нужно явно указать здесь диспетчер REQUEST
, иначе он будет считать, что вы ' переопределяя его полностью и интересует только диспетчер FORWARD
.
Внутри фильтра, если вы хотите различать guish между REQUEST
и FORWARD
, тогда вы можете затем проверьте это, определив наличие атрибута запроса с ключом RequestDispatcher#FORWARD_REQUEST_URI
String forwardRequestURI = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
if (forwardRequestURI != null) {
// Forward was triggered on the given URI.
}