Что делает doFilter в методе doFilter в фильтрах Java? - PullRequest
35 голосов
/ 13 января 2010

Я хочу знать, что в нашем методе dofilter я сделал этот вызов chain.doFilter . Что делает doFilter внутри doFilter? Разве он не получит рекурсивный вызов?

Ответы [ 6 ]

51 голосов
/ 13 января 2010

Фильтры сервлетов - это реализация шаблона проектирования Цепочка ответственности .

Все фильтры объединены в цепочку (в порядке их определения в web.xml). chain.doFilter() переходит к следующему элементу в цепочке. Последний элемент цепочки - целевой ресурс / сервлет.

13 голосов
/ 13 января 2010

Он вызывает метод doFilter объекта chain, а не самого себя, поэтому нет, он не будет рекурсивным.

Имя chain предполагает наличие последовательности фильтров.с каждым фильтром, выполняющим некоторую обработку, а затем переходящим к следующему в последовательности, так что каждый объект имеет элемент chain, указывающий на следующий фильтр в последовательности, который вызывается после того, как фильтр выполнил свою собственную обработку.В последнем случае в последовательности, вероятно, будет null в качестве значения chain, или он сам будет знать, что он последний в последовательности.

2 голосов
/ 13 января 2010

Внутренне он вызывает doFilter следующего фильтра в цепочке фильтров, а когда цепочка заканчивается, он вызывает целевой сервлет.

1 голос
/ 25 сентября 2013

Вызывает запуск следующего фильтра в цепочке или, если вызывающий фильтр является последним фильтром в цепочке, вызывает ресурс на конце цепочки.

1 голос
/ 13 января 2010

Не имея никакого кода, о котором вы говорите, я могу только предположить, что вы что-то вроде:

class Filter implements FilterAPI {
  private FilterAPI chain;
  FilterAPI(FilterAPI chain) { this.chain = chain; }
  @override void doFilter (Set setToFilter) {
    // do some filtering on setToFilter
    chain.doFilter(setToFilter);
  }
}

Если это так, то вы не вызываете ничего рекурсивно, вы вызываете doFilter () для другого объекта. Как уже упоминалось в другом ответе, это хорошо известный шаблон проектирования цепочки ответственности.

1 голос
/ 13 января 2010

Вызывая chain.doFilter, вы передаете запрос / ответ следующему фильтру в вашей цепочке фильтров. Если вы не вызываете его, то следующий фильтр (вероятно, определенный в вашем web.xml) не будет выполнен.

Если бы вы только что вызвали doFilter, то да, у вас была бы бесконечная рекурсия и переполнение стека. Однако вы вызываете метод doFilter объекта filterChain, который указывает ему выполнить следующий фильтр.

...