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

В чем разница между Filters, Interceptors и Listeners в Spring?

Sobes Copilot

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

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

sobes.tech AI

Различия заключаются в назначении и этапе обработки запроса:

  • Filters (Фильтры):

    • Входят в спецификацию Servlet API.
    • Работают на уровне контейнера сервлетов (например, Tomcat).
    • Перехватывают запросы до отправки в Spring DispatcherServlet и ответы после его обработки.
    • Используются для общих задач, таких как аутентификация, авторизация, логирование, преобразование кодировки, сжатие данных.
    • Имеют доступ к объектам HttpServletRequest и HttpServletResponse.
    • Могут изменять или останавливать обработку запроса.
    • Конфигурируются в web.xml или с помощью аннотаций @WebFilter.
    // Пример простого фильтра
    import javax.servlet.*;
    import java.io.IOException;
    
    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            // Инициализация
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            // Логика до контроллера
            System.out.println("Запрос прошел через фильтр");
            chain.doFilter(request, response); // Передача запроса дальше по цепочке
            // Логика после контроллера
            System.out.println("Ответ прошел через фильтр");
        }
    
        @Override
        public void destroy() {
            // Очистка
        }
    }
    
  • Interceptors (Перехватчики):

    • Являются частью Spring Web MVC.
    • Работают на уровне DispatcherServlet.
    • Перехватывают запросы после того, как запросу был назначен контроллер, но до вызова метода контроллера, а также после вызова метода контроллера.
    • Используются для более специфичных задач, связанных с обработкой веб-запросов, таких как проверка пользовательской сессии, обработка исключений контроллера, добавление данных в модель перед рендерингом представления.
    • Имеют доступ к объектам HttpServletRequest, HttpServletResponse и Handler (метод контроллера).
    • Могут изменять ModelAndView или останавливать обработку запроса.
    • Конфигурируются через WebMvcConfigurer или XML-конфигурацию.
    // Пример простого перехватчика
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // Логика до вызова контроллера
            System.out.println("Запрос прошел через перехватчик (preHandle)");
            return true; // true - продолжить обработку, false - остановить
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            // Логика после вызова контроллера, до рендеринга представления
            System.out.println("Запрос прошел через перехватчик (postHandle)");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            // Логика после завершения обработки запроса, включая рендеринг представления
            System.out.println("Запрос прошел через перехватчик (afterCompletion)");
        }
    }
    
  • Listeners (Слушатели):

    • Входят в спецификацию Servlet API.
    • Реагируют на события жизненного цикла веб-приложения, сессии или сервлет-контекста.
    • Не перехватывают непосредственно запросы.
    • Примеры событий: запуск/остановка приложения, создание/уничтожение сессии, добавление/удаление атрибутов в контексте или сессии.
    • Используются для инициализации/очистки ресурсов приложения, управления сессиями, логирования.
    • Конфигурируются в web.xml или с помощью аннотаций @WebListener.
    // Пример слушателя событий сессии
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    public class MySessionListener implements HttpSessionListener {
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            // Событие создания сессии
            System.out.println("Сессия c ID " + se.getSession().getId() + " создана.");
        }
    
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            // Событие уничтожения сессии
            System.out.println("Сессия c ID " + se.getSession().getId() + " уничтожена.");
        }
    }
    

Сводная таблица:

Характеристика Filter Interceptor Listener
Спецификация Servlet API Spring Web MVC Servlet API
Уровень работы Контейнер сервлетов (до DispatcherServlet) DispatcherServlet (после назначения контроллеру) Жизненный цикл приложения/сессии/контекста
Что перехватывает Запросы и ответы (до/после DS) Запросы (до/после контроллера) События жизненного цикла
Доступные объекты HttpServletRequest, HttpServletResponse HttpServletRequest, HttpServletResponse, Handler (Object) Зависит от типа слушателя (например, HttpSessionEvent)
Назначение Общие задачи (аутентификация, логирование, кодировка) Веб-специфичные задачи (сессия, исключения контроллера) Управление жизненным циклом, ресурсами
Метод конфигурации web.xml, @WebFilter WebMvcConfigurer, XML web.xml, @WebListener
Способ остановки chain.doFilter() не вызывается preHandle() возвращает false Неapplicable к перехвату запросов