Жизненный цикл запроса в соответствии со спецификацией сервлета проходит через цепочку фильтров, прежде чем сервлет окончательно исполняется.
Это довольно интуитивно понятно, когда вы смотрите на сигнатуру для метода doFilter в Filter
interface
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
То есть в фильтре у вас есть доступ к запросу и ответу и цепочке.Контракт заключается в том, что вы, как разработчик, должны вызывать chain
либо до, либо после операций, которые вы выполняете в фильтре, или вообще не вызывать их, если желательно не продолжать выполнение.Вызов chain.doFilter(...)
вызовет выполнение следующего фильтра в цепочке фильтров с отображением, соответствующим запрошенному URL.Последним участником цепочки является сервлет, сопоставление которого соответствует запрошенному URL.
Технически вы можете делать все в фильтре, что вы можете делать в сервлете.Вы можете создать свое приложение, чтобы выполнять всю обработку и рендеринг в фильтре и иметь пустой сервлет, который ничего не делает.Основное отличие состоит в том, что если сервлет не сопоставлен с данным URL-адресом, контейнер должен ответить ошибкой 404, поэтому всегда должен быть сервлет, сопоставленный с любым URL-адресом, который вы хотите обслуживать.Вы также можете иметь только один сервлет, сопоставленный с URL, но у вас может быть любое количество фильтров.