Назад к вопросам
Middle
85
questionbank

Что вы знаете о сервлетных фильтрах?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Сервлетные фильтры позволяют перехватывать и обрабатывать входящие запросы и исходящие ответы в веб-приложении до того, как они достигнут сервлета, и после того, как сервлет завершит обработку. Они используются для общей логики, такой как аутентификация, логирование, сжатие данных или изменение содержимого запроса/ответа.

Фильтры реализуют интерфейс javax.servlet.Filter и имеют три основных метода:

  1. init(FilterConfig filterConfig): Вызывается один раз при инициализации фильтра. Используется для настройки.
  2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain): Основной метод, выполняющий логику фильтра. Параметр FilterChain позволяет передать запрос/ответ следующему фильтру в цепочке или конечному сервлету с помощью метода chain.doFilter().
  3. 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) работают на более высоком уровне абстракции (компоненты, методы или контроллеры).

Фильтры являются мощным средством для реализации кросс-функциональной логики, которая должна быть применена ко многим запросам или ответам в веб-приложении без ее дублирования в каждом сервлете.