От 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. Обычно это показывает, когда нужно сопоставить фильтр с определенными типами контента (например, изображениями) или со всеми запросами.
HandlerIntercepter
является концепцией Spring. Чтобы зарегистрировать фильтр сервлета, вы можете зарегистрировать его, используя старыйweb.xml
(Servlet 2.5 и более ранние версии) или новый программный подход (Servlet 3+). ПосколькуHandlerIntercepter
это всего лишь абстракция Spring, вам следует зарегистрироваться в контексте SpringWebApplication
одного для каждого диспетчера, поэтому сервлет и фильтр связаны с контекстом, рекомендуется связать перехватчик и фильтр,rootContext
чтобы, если у нескольких диспетчеров u hv все могут совместно использовать одно и то же.Фильтр : - Фильтр, как следует из названия, представляет собой класс Java, выполняемый контейнером сервлета для каждого входящего HTTP-запроса и для каждого HTTP-ответа. Таким образом, можно управлять входящими HTTP-запросами до того, как они достигнут ресурса, такого как страница JSP, сервлет или простая статическая страница; Таким же образом можно управлять исходящим HTTP-ответом после выполнения ресурса.
Перехватчик : - Перехватчики Spring похожи на фильтры сервлетов, но они действуют в контексте Spring, поэтому они очень эффективны для управления HTTP-запросами и ответами, но они могут реализовать более сложное поведение, поскольку могут получить доступ ко всему контексту Spring.
источник
HandlerInterceptor дает вам более детальный контроль, чем фильтр, потому что у вас есть доступ к фактическому целевому «обработчику» - это означает, что любое действие, которое вы выполняете, может варьироваться в зависимости от того, что фактически делает запрос (тогда как фильтр сервлета обычно применяется ко всем запросам - только возможность учитывать параметры каждого запроса). HandlerInterceptor также предоставляет 3 разных метода, так что вы можете применять поведение до вызова обработчика, после того, как обработчик завершил работу, но до рендеринга представления (где вы даже можете полностью обойти рендеринг представления) или после того, как само представление было отрисовано. Кроме того, вы можете настроить разные перехватчики для разных групп обработчиков - перехватчики настраиваются в handlerMapping, и может быть несколько handlerMappings.
Следовательно, если вам нужно сделать что-то совершенно общее (например, регистрировать все запросы), тогда достаточно фильтра - но если поведение зависит от целевого обработчика или вы хотите сделать что-то между обработкой запроса и визуализацией представления, тогда HandlerInterceptor обеспечивает такую гибкость.
Ссылка: http://static.springframework.org/sp...ng-interceptor
источник