Назад к вопросам
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 к перехвату запросов |