2010-01-13 2 views

ответ

44

Сервлет-фильтры - это реализация шаблона проектирования Chain of responsibility.

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

13

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

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

1

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

0

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

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

0

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

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

Это похоже на C#, этот пост отмечен java. Однако ответ все еще верен. – gbtimmon

+0

Я считаю, что вышеприведенный код Java? Я просто исправил имя конструктора, хотя ... –

+0

Возможно, я был в замешательстве, потому что я никогда не видел интерфейс filterAPI в java только java.servlet.Filter. Превращает его только мое собственное невежество. Откуда FilterAPI? – gbtimmon

1

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