Получить доступ

Чем Servlet Filter отличается от HandlerInterceptor?

MiddleСервлеты и фильтрыSpring
Ещё спрашивают так:
  • Где добавить логирование всех запросов в Spring?
Коротко

Filter — уровень сервлетного контейнера: работает до DispatcherServlet и видит любой запрос, включая статику и ошибки. HandlerInterceptor — внутри Spring MVC, знает обработчик (контроллер и метод) и вызывается вокруг него.

  • Filter: безопасность (Spring Security — цепочка фильтров), CORS, сжатие, корреляционный id, логирование всех запросов
  • Interceptor: проверки, зависящие от контроллера, атрибуты модели, замер времени обработчика
  • Interceptor: preHandle, postHandle (не вызывается при исключении), afterCompletion

А ещё Для сквозной логики вокруг методов бинов — AOP

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Filter (jakarta.servlet.Filter, в Spring — OncePerRequestFilter) регистрируется в контейнере и оборачивает весь запрос: chain.doFilter(req, res) передаёт управление дальше. Видит сырой запрос и ответ, может их обернуть (кэшировать тело для логирования), отклонить запрос до Spring. Не знает, какой контроллер обработает запрос.

HandlerInterceptor вызывается DispatcherServlet после выбора обработчика:

  • preHandle(req, res, handler) — до контроллера; false — прервать;
  • postHandle(...) — после контроллера, до рендеринга представления (при исключении не вызывается, а для @ResponseBody ответ уже записан);
  • afterCompletion(..., ex) — после завершения, в том числе при ошибке.

Получает HandlerMethod — можно читать аннотации метода контроллера. Регистрация: WebMvcConfigurer.addInterceptors с путями.

Что куда:

  • безопасность, CORS, корреляционный идентификатор в MDC, логирование всех запросов, ограничение частоты — фильтр;
  • логика, зависящая от аннотаций контроллера, замер времени обработчика, общие атрибуты модели — interceptor;
  • транзакции, кэширование, аудит методов сервисов — AOP.

Что хотят услышать

  • Уровни: контейнер против Spring MVC.
  • Что видит каждый и методы interceptor.
  • Примеры применения.

Частые ошибки

  • Ожидать postHandle при исключении в контроллере.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Interceptor работает до DispatcherServlet, Filter — после
  • ✗Это одно и то же
  • ✗Filter применим только к статическим ресурсам
  • ✓Filter работает на уровне контейнера до DispatcherServlet (цепочка); Interceptor — внутри MVC, вокруг выбранного handler

Что спросят дальше

  • Что такое Listener?
  • Где живёт Spring Security filter chain?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем