Подтвердить что ты не робот

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

Я немного запутался в целях Filter и Interceptor.

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

Итак, где же разница между postHandle() в Interceptor и doFilter() в Filter?

Spring MVC sheme Какова наилучшая практика использования прецедентов? На этом рисунке, где работают Filter и Interceptor s?

4b9b3361

Ответ 1

Цитата из HandlerIntercepter javadoc:

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

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

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

Итак, где разница между PostHandle() в Interceptor и doFilter() в фильтре?

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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