Выполняется ли 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

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