Я хочу знать, что в нашем методе дофильтра я сделал этот звонок chain.doFilter. Что делает doFilter внутри doFilter? Не получится ли рекурсивный вызов?Что делает doFilter делать в doFilter метод в фильтрах java?
ответ
Сервлет-фильтры - это реализация шаблона проектирования Chain of responsibility.
Все фильтры привязаны (в порядке их определения в web.xml). chain.doFilter()
переходит к следующему элементу в цепочке. Последним элементом цепочки является целевой ресурс/сервлет.
Это метод doFilter
объекта chain
, а не сам, поэтому нет, он не будет рекурсивным.
. Название chain
предполагает, что у вас есть последовательность фильтров, причем каждый фильтр выполняет некоторую обработку, а затем переходит к следующей последовательности, поэтому каждый объект имеет член chain
, чтобы указать на следующий фильтр в последовательности, которая вызывается после того, как фильтр выполнил собственную обработку. Последний в последовательности, вероятно, будет иметь значение null
как значение chain
, либо он сам по себе знает, что он является последним в последовательности.
Внутренне он вызывает doFilter
следующего фильтра в цепочке фильтров, и, когда цепь завершена, он вызывает целевой сервлет.
Вызвав chain.doFilter, вы передаете запрос/ответ на следующий фильтр в вашей цепочке фильтров. Если вы этого не сделаете, следующий фильтр (вероятно, определенный в вашем web.xml) не будет выполнен.
Если вы только что назовете doFilter, то да, у вас будет бесконечная рекурсия и стековый поток. Однако вы вызываете метод doFilter объекта filterChain, который инструктирует его выполнить следующий фильтр.
Не имея какой-либо код, который вы говорите, я могу только предположить, что вы что-то вроде:
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() на другом объекте. Как уже упоминалось в другом ответе, это хорошо известный шаблон дизайна цепочки ответственности.
Это похоже на C#, этот пост отмечен java. Однако ответ все еще верен. – gbtimmon
Я считаю, что вышеприведенный код Java? Я просто исправил имя конструктора, хотя ... –
Возможно, я был в замешательстве, потому что я никогда не видел интерфейс filterAPI в java только java.servlet.Filter. Превращает его только мое собственное невежество. Откуда FilterAPI? – gbtimmon
Вызывает следующий фильтр в цепочке, который вызывается, или если вызывающий фильтр является последним фильтром в цепочке, вызывает вызов ресурса в конце цепочки.
http://java.sun.com/products/servlet/Filters.html – Fortega