Что вы знаете о сервлетных фильтрах?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Сервлетные фильтры позволяют перехватывать и обрабатывать входящие запросы и исходящие ответы в веб-приложении до того, как они достигнут сервлета, и после того, как сервлет завершит обработку. Они используются для общей логики, такой как аутентификация, логирование, сжатие данных или изменение содержимого запроса/ответа.
Фильтры реализуют интерфейс 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:
<filter>
<filter-name>AuthenticationFilter</filter-name>
<filter-class>com.example.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<url-pattern>/secure/*</url-pattern>
</filter-mapping>
Пример с аннотацией:
@WebFilter("/secure/*")
public class AuthenticationFilter implements Filter {
// ... implementation of init, doFilter, destroy
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// Логика аутентификации
if (isAuthenticated(request)) {
chain.doFilter(request, response); // Передача далее по цепочке
} else {
((HttpServletResponse) response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
// ... init and destroy methods
}
Цепочка фильтров (FilterChain) позволяет последовательно применять несколько фильтров к одному запросу/ответу. Порядок выполнения фильтров определяется в web.xml или с помощью атрибутов аннотаций.
Отличия от Interceptors в Spring/Java EE:
- Сервлетные фильтры работают на уровне контейнера сервлетов и веб-архитектуры.
- Interceptors (например, CDI Interceptors или Spring MVC Interceptors) работают на более высоком уровне абстракции (компоненты, методы или контроллеры).
Фильтры являются мощным средством для реализации кросс-функциональной логики, которая должна быть применена ко многим запросам или ответам в веб-приложении без ее дублирования в каждом сервлете.