Подтвердить что ты не робот

Что делает doFilter в методе doFilter в фильтрах java?

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

4b9b3361

Ответ 1

Сервлет-фильтры - это реализация шаблона дизайна Цепь ответственности.

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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() на другом объекте. Как уже упоминалось в другом ответе, это хорошо известный шаблон дизайна цепочки ответственности.