Я хочу знать, что в нашем методе dofilter я сделал этот вызов chain.doFilter. Что делает doFilter внутри doFilter? Не получится ли рекурсивный вызов?
Что делает doFilter в методе doFilter в фильтрах java?
Ответ 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() на другом объекте. Как уже упоминалось в другом ответе, это хорошо известный шаблон дизайна цепочки ответственности.