Сервлетные фильтры позволяют перехватывать и обрабатывать входящие запросы и исходящие ответы в веб-приложении до того, как они достигнут сервлета, и после того, как сервлет завершит обработку. Они используются для общей логики, такой как аутентификация, логирование, сжатие данных или изменение содержимого запроса/ответа.
Фильтры реализуют интерфейс javax.servlet.Filter и имеют три основных метода:
init(FilterConfig filterConfig): Вызывается один раз при инициализации фильтра. Используется для настройки.doFilter(ServletRequest request, ServletResponse response, FilterChain chain): Основной метод, выполняющий логику фильтра. Параметр FilterChain позволяет передать запрос/ответ следующему фильтру в цепочке или конечному сервлету с помощью метода chain.doFilter().destroy(): Вызывается один раз перед уничтожением фильтра. Используется для очистки ресурсов.Конфигурирование фильтров осуществляется либо через web.xml, либо с помощью аннотации @WebFilter (начиная с Servlet 3.0).
Пример из web.xml:
xml
Пример с аннотацией:
java
Цепочка фильтров (FilterChain) позволяет последовательно применять несколько фильтров к одному запросу/ответу. Порядок выполнения фильтров определяется в web.xml или с помощью атрибутов аннотаций.
Отличия от Interceptors в Spring/Java EE:
Фильтры являются мощным средством для реализации кросс-функциональной логики, которая должна быть применена ко многим запросам или ответам в веб-приложении без ее дублирования в каждом сервлете.