Spring HandlerInterceptor против фильтров сервлетов

Теперь в Spring можно настроить HandlerInterceptor будет вызываться только для определенных URL-адресов с использованием <mvc:interceptors>.

Фильтры сервлетов могут выполнять те же функции (ведение журнала, безопасность и т. Д.). Итак, какой из них следует использовать?

Я думаю, что с перехватчиками можно использовать объект ModelAndView для работы с моделями, поэтому он имеет больше преимуществ. Может ли кто-нибудь нарисовать сценарии, в которых фильтры или перехватчики имеют преимущества перед другими?


person aces.    schedule 03.11.2011    source источник
comment
Фильтр сервлетов используется только в веб-слое, вы не можете использовать его вне веб-контекста. Перехватчики можно использовать где угодно. В этом главное отличие. javabench.in/2011/10/java-difference- между-filter-and.html   -  person Raúl    schedule 28.05.2014


Ответы (4)


org.springframework.web.servlet.HanderInterceptor Интерфейс JavaDoc содержит два абзаца, в которых обсуждается этот вопрос:

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

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

person Ralph    schedule 04.11.2011
comment
Итак, теперь у меня есть 2 точки зрения. По-видимому, в предыдущем сообщении говорится, что HandlerInterceptors более мощные. Я понимаю, что HandlerInterceptors являются частью Spring Framework и вне Spring я не думаю, что их можно использовать. Но разве в проектах на основе Spring у них нет преимущества перед фильтрами? - person aces.; 04.11.2011
comment
@aces: да: главное преимущество springframework HanderInterceptor - то, что они могут перехватывать между обработкой контроллера и рендерингом представления, - и они являются Spring Beans, поэтому легко получить доступ к другим Spring bean. - person Ralph; 20.07.2015

Перехватчики Spring Handler позволяют подключаться к большему количеству частей жизненного цикла запроса и получать доступ к дополнительной информации в процессе. Часто они более тесно связаны с циклом запроса / ответа, чем фильтры.

Фильтры больше подходят для обработки вашего запроса / ответа как системы черного ящика. Они будут работать независимо от того, как реализован сервлет.

Если вы используете Spring MVC, нет особых причин писать новую логику в качестве фильтра сервлета. Все, что могут делать фильтры, может делать перехватчики проще и элегантнее.

Помните также, что фильтры сервлетов существуют гораздо дольше, чем перехватчики.

person skaffman    schedule 04.11.2011
comment
Итак, в проектах на основе Spring вместо фильтра для обработки URL-адресов, обслуживающих статический контент, мы можем использовать Spring Handlerinterceptors. Я согласен с вашей точкой зрения относительно того, что HandlerInterceptors более мощные, чем фильтры. Но можете ли вы придумать сценарий (приложение на основе Spring), в котором вместо этого следует использовать фильтры? - person aces.; 04.11.2011
comment
@aces: Единственный сценарий, который я могу придумать, - это если у вас есть несколько DispatcherServlet в одном веб-приложении, и вы хотите перехватывать запросы по всем из них. Однако такое случается редко. - person skaffman; 05.11.2011
comment
Перехватчики Spring Handler не могут сделать одно - обернуть объекты запроса / ответа в пользовательские типы. Насколько я могу судить, для этого вам все еще нужен фильтр. - person Erin Drummond; 18.11.2014
comment
@ErinDrummond верен - фреймворки, которые настраивают реализации методов ServletRequest или ServletResponse, используют оболочки и требуют использования фильтра. Spring HandlerInterceptors не может этого сделать. - person Les Hazlewood; 19.02.2015
comment
@skaffman - Я знаю, что поднимаю старый вопрос, но в случае, если я хочу рассчитать время запроса в фильтре запросов, мне не хватит времени, потраченного на запрос во фреймворке. Достаточно ли это для меня, чтобы возиться с фильтром сервлета, или обработчик-перехватчик даст мне достаточно точное значение? - person kapad; 13.07.2015

С перехватчиком Spring у вас есть доступ к обработчику, который может быть полезен. Кроме того, с перехватчиком Spring у вас есть доступ к выполнению логики до рендеринга представления и после рендеринга представления.

person smp7d    schedule 03.11.2011
comment
Фильтры (в сервлете) могут изменять ответ, когда он идет к клиенту (браузеру) от сервлета. Таким же образом мы можем изменить ответ или управлять объектом ответа, когда Spring Controller отправляет ответ клиенту (браузеру)? Если ответ НЕТ, то какой альтернативный способ сделать это? Я не хочу использовать фильтры (в сервлете). - person AmitG; 02.01.2014

Servlet Filter:

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

Такое поведение позволяет реализовать общие функции, повторно используемые во многих различных контекстах.

введите здесь описание изображения

Как показано на рисунке выше, фильтр работает в веб-контейнере, поэтому его определение также будет содержаться в файле web.xml.

Фильтр включает три основных метода:

  1. init: выполняется для инициализации фильтра с использованием элемента init-param в определении фильтра.
  2. doFilter: выполняется для всех входящих HTTP-запросов, удовлетворяющих "шаблону URL".
  3. destroy: освободить ресурсы, используемые фильтром.

Interceptor:

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

введите здесь описание изображения

Перехватчик Spring выполняется в контексте SpringMVC, поэтому они были определены в файле rest-servlet.xml:

Перехватчик включает три основных метода:

  1. preHandle: выполняется перед выполнением целевого ресурса.
  2. afterCompletion: выполняется после выполнения целевого ресурса (после рендеринга представления).
  3. postHandle: перехватить выполнение обработчика.
person Noman Akhtar    schedule 23.03.2020
comment
диаграммы были большим подспорьем - person superigno; 30.06.2021