Выполняется ли doFilter() до или после завершения работы сервлета?
Объект javax.servlet.Filter может использоваться как для аутентификации (где Фильтру необходимо перехватить запрос до выполнения какой-либо работы с сервлетом), так и для трансляции XSLT (где сервлет должен быть полностью завершен при генерации контента). Когда это действительно выполняется?
Я знаю, что это зависит от реализации (от веб-контейнера), но это, кажется, проблема, которая должна быть решена всеми из них.
Может быть, где-то установлен параметр конфигурации для каждой регистрации фильтра в веб-контейнере?
Дополнительно:
Кроме того, что определяет порядок выполнения фильтра? Почему FooFilter исполняется до BarFilter?
3 ответа
Цепочка фильтров по сути обертывает вызов сервлета. Цепочка будет обрабатывать все ссылки до тех пор, пока не достигнет "дна", затем разрешит запуск сервлета и затем вернется вверх по цепочке в обратном порядке. Например, если у вас есть новый "пример фильтра", ваш метод doFilter() может выглядеть так:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// do pre-servlet work here
chain.doFilter(request, response);
// do post servlet work here
}
http://img228.imageshack.us/img228/8945/filter.png
О порядке: как я помню из спецификации, сервлет-контейнер не гарантирует, что фильтры будут вызываться в каком-то порядке.
@Rich: doFilter() выполняется до или после завершения работы сервлета?
Фильтр - это программа, запускаемая на сервере перед страницей сервлета или JSP, с которой он связан.
В соответствии со спецификацией servlet2.3 фильтр выполняется в соответствии с конфигурацией web.xml последовательности сопоставления фильтров. Ссылка http://www.programering.com/a/MTMyADOwATI.html