Вопрос с собеседования · Spring

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

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

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

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

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

Подробно

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 при исключении в контроллере.

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования