Чем Servlet Filter отличается от HandlerInterceptor?
- Где добавить логирование всех запросов в 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?
Разбор темы
- Сервлеты, фильтры и встроенный контейнер
Сервлет и встроенный Tomcat, модель thread-per-request, потокобезопасность контроллеров, Filter против Interceptor и forward/redirect.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.