Я хочу знать, что в нашем dofilter методе я выполнил этот вызов chain.doFilter. Что doFilter делает в doFilter? Это не собирающийся получать рекурсивный вызов?
Фильтры сервлета являются реализацией цепочки ответственности .
Все фильтры цепны (в порядке их определения в web.xml). Цепь ()
продолжается к следующему элементу в цепочке. Последний элемент цепи является целевой ресурс / сервлет.
Это называет дофильтром
методом цепи
Объект, не сам, поэтому нет, это не будет рекурсивным.
Название Цепочка
позволяет предположить, что у вас есть последовательность фильтров, причем каждый фильтр выполняет некоторую обработку, а затем передающую следующую последовательность, поэтому каждый объект имеет элемент
Чтобы указать на следующий фильтр в последовательности, которая вызывается после того, как фильтр выполнил свою собственную обработку. Последнее в последовательности, вероятно, будет тогда NULL
как цепочка
значение, или она умеет самостоятельно, что это последний в последовательности.
, вызывая Chain.doFilter Вы передаете запрос / ответ на следующий фильтр в вашей цепочке фильтра. Если вы не назваете это, то следующий фильтр (вероятно, определен в вашем web.xml), не будет выполнен.
Если вы только что позвонили дофильтеру, то да, у вас будет бесконечная рекурсия и стойка. Тем не менее, вы называете дофилтер-метод объекта FilterChain, который дает ему выполнить следующий фильтр.
Внутренне он вызывает doFilter
следующего фильтра в цепочке фильтрации, а по завершении цепочки вызывает целевой сервлет.
Не имея ни одного кода, о котором вы говорите, я могу только предположить, что вам что-то вроде:
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);
}
}
, если это так, то вы не звоните ничего рекурсивно, вы звоните в дофильтере () на другом объекте. Как упомянуто на другом ответе, это хорошо известная цепочка дизайн ответственности.