Разница между перехватчиком и фильтром в Spring MVC


111

Немного запутались Filterи Interceptorцели.

Как я понял из документации, Interceptorзапускается между запросами. С другой стороны Filter, запускается перед визуализацией представления, но после того, как контроллер обработал ответ.

Так в чем же разница между postHandle()Interceptor и doFilter()Filter?

Схема Spring MVC Какова наилучшая практика, в каких случаях ее следует использовать? На этой картинке где работает Filters и Interceptors?

Ответы:


87

От HandlerIntercepter«S Javadoc :

HandlerInterceptorв основном похож на сервлет Filter, но в отличие от последнего он просто позволяет настраивать предварительную обработку с возможностью запретить выполнение самого обработчика и настраиваемую постобработку. Фильтры более мощные, например, они позволяют обмениваться объектами запроса и ответа, которые передаются по цепочке. Обратите внимание , что фильтр получает настроен web.xml, HandlerInterceptorв контексте приложения.

В качестве основного ориентира для HandlerInterceptorреализации могут быть использованы мелкозернистые задачи предварительной обработки, связанные с обработчиком , особенно с учетом кода общего обработчика и проверок авторизации. С другой стороны, a Filterхорошо подходит для обработки запросов и просмотра контента, например для составных форм и сжатия GZIP. Обычно это показывает, когда нужно сопоставить фильтр с определенными типами контента (например, изображениями) или со всеми запросами.

С учетом сказанного:

Так в чем же разница между Interceptor#postHandle()и Filter#doFilter()?

postHandleбудет вызываться после вызова метода обработчика, но до рендеринга представления. Таким образом, вы можете добавить объекты модели к виду , но вы можете не изменить , HttpServletResponseтак как оно уже совершено.

doFilterнамного более универсален, чем postHandle. Вы можете изменить запрос или ответ и передать его в цепочку или даже заблокировать обработку запроса.

Кроме того , в preHandleи postHandleметодах, у вас есть доступ к HandlerMethodкоторый обработал запрос. Таким образом, вы можете добавить логику предварительной / постобработки на основе самого обработчика. Например, вы можете добавить логику для методов-обработчиков, которые имеют некоторые аннотации.

Какова наилучшая практика, в каких случаях ее следует использовать?

Как сказано в документе, детализированные задачи предварительной обработки, связанные с обработчиком, являются кандидатами для HandlerInterceptorреализации, особенно с учетом кода общего обработчика и проверок авторизации. С другой стороны, a Filterхорошо подходит для обработки запросов и просмотра контента, например для составных форм и сжатия GZIP. Обычно это показывает, когда нужно сопоставить фильтр с определенными типами контента (например, изображениями) или со всеми запросами.


Обратите внимание, что фильтр настраивается в web.xml, а HandlerInterceptor в контексте приложения ??? Вы можете объяснить, пожалуйста?

5
Фильтр связан с API сервлетов и HandlerIntercepterявляется концепцией Spring. Чтобы зарегистрировать фильтр сервлета, вы можете зарегистрировать его, используя старый web.xml(Servlet 2.5 и более ранние версии) или новый программный подход (Servlet 3+). Поскольку HandlerIntercepterэто всего лишь абстракция Spring, вам следует зарегистрироваться в контексте Spring
Али Дехгани,

Фильтр связан с API сервлетов, а HandlerIntercepter - это концепция Spring. круто! но независимо от того, что ur, зарегистрированное в web.xml, является частью WebApplicationодного для каждого диспетчера, поэтому сервлет и фильтр связаны с контекстом, рекомендуется связать перехватчик и фильтр, rootContextчтобы, если у нескольких диспетчеров u hv все могут совместно использовать одно и то же.

9

Фильтр : - Фильтр, как следует из названия, представляет собой класс Java, выполняемый контейнером сервлета для каждого входящего HTTP-запроса и для каждого HTTP-ответа. Таким образом, можно управлять входящими HTTP-запросами до того, как они достигнут ресурса, такого как страница JSP, сервлет или простая статическая страница; Таким же образом можно управлять исходящим HTTP-ответом после выполнения ресурса.

Перехватчик : - Перехватчики Spring похожи на фильтры сервлетов, но они действуют в контексте Spring, поэтому они очень эффективны для управления HTTP-запросами и ответами, но они могут реализовать более сложное поведение, поскольку могут получить доступ ко всему контексту Spring.


2
источник: mkjava.com/tutorial/filter-vs-interceptor необходимо упомянуть источник
Premraj

Что касается фильтра безопасности Spring, он также дает вам контекст Spring.
Ловин,

6

HandlerInterceptor дает вам более детальный контроль, чем фильтр, потому что у вас есть доступ к фактическому целевому «обработчику» - это означает, что любое действие, которое вы выполняете, может варьироваться в зависимости от того, что фактически делает запрос (тогда как фильтр сервлета обычно применяется ко всем запросам - только возможность учитывать параметры каждого запроса). HandlerInterceptor также предоставляет 3 разных метода, так что вы можете применять поведение до вызова обработчика, после того, как обработчик завершил работу, но до рендеринга представления (где вы даже можете полностью обойти рендеринг представления) или после того, как само представление было отрисовано. Кроме того, вы можете настроить разные перехватчики для разных групп обработчиков - перехватчики настраиваются в handlerMapping, и может быть несколько handlerMappings.

Следовательно, если вам нужно сделать что-то совершенно общее (например, регистрировать все запросы), тогда достаточно фильтра - но если поведение зависит от целевого обработчика или вы хотите сделать что-то между обработкой запроса и визуализацией представления, тогда HandlerInterceptor обеспечивает такую ​​гибкость.

Ссылка: http://static.springframework.org/sp...ng-interceptor


2
Ссылка не работает.
Джейсон Лоу
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.