web-dev-qa-db-fra.com

Différence entre intercepteur et filtre dans Spring MVC

Je suis un peu confus à propos des objectifs Filter et Interceptor.

D'après ce que j'ai compris de la documentation, Interceptor est exécuté entre les demandes. Par contre, Filter est exécuté avant de rendre la vue, mais après la réponse de Controller.

Alors, où est la différence entre postHandle() dans Interceptor et doFilter() dans Filter?

Spring MVC sheme Quelle est la meilleure pratique dans quels cas d'utilisation il devrait être utilisé? Dans cette image où travaille Filters et Interceptors?

68
rpieniazek

Citant de HandlerIntercepter ' javadoc :

HandlerInterceptor est fondamentalement similaire à un Servlet Filter, mais contrairement à ce dernier, il ne permet qu'un prétraitement personnalisé avec la possibilité d'interdire l'exécution du gestionnaire lui-même et un post-traitement personnalisé. Les filtres sont plus puissants, ils permettent par exemple l'échange des objets de requête et de réponse transmis dans la chaîne. Notez qu'un filtre est configuré dans web.xml, un HandlerInterceptor dans le contexte de l'application.

En règle générale, les tâches de pré-traitement relatives aux gestionnaires à granularité fine sont candidates pour les implémentations HandlerInterceptor, en particulier le code de gestionnaire commun et les contrôles d'autorisation factorisés. D'autre part, une variable Filter convient parfaitement à la demande de contenu et à la gestion du contenu de la vue, comme les formulaires en plusieurs parties et la compression GZIP. Cela indique généralement quand il est nécessaire de mapper le filtre sur certains types de contenu (par exemple, des images) ou sur toutes les demandes.

Cela étant dit:

Alors, quelle est la différence entre PostHandle () dans Interceptor et doFilter () dans Filter?

postHandle sera appelé après l'appel de la méthode du gestionnaire, mais avant le rendu de la vue. Ainsi, vous pouvez ajouter d'autres objets de modèle à la vue, mais vous ne pouvez pas modifier la HttpServletResponse, car elle a déjà été validée. doFilter est beaucoup plus polyvalent que le postHandle. Vous pouvez modifier la demande ou la réponse et la transmettre à la chaîne, voire bloquer le traitement de la demande.

De plus, dans les méthodes preHandle et postHandle, vous avez accès à la méthode HandlerMethod qui a traité la demande. Vous pouvez donc ajouter une logique de pré-post-traitement basée sur le gestionnaire lui-même. Par exemple, vous pouvez ajouter une logique pour les méthodes de gestionnaire qui comportent des annotations.

Quelle est la meilleure pratique dans quels cas d'utilisation il devrait être utilisé?

Comme le dit la doc, les tâches de pré-traitement relatives aux gestionnaires à granularité fine sont candidates pour les implémentations HandlerInterceptor, en particulier le code de gestionnaire commun et les contrôles d'autorisation factorisés. D'autre part, une variable Filter convient parfaitement à la demande de contenu et à la gestion du contenu de la vue, comme les formulaires en plusieurs parties et la compression GZIP. Cela indique généralement quand il est nécessaire de mapper le filtre sur certains types de contenu (par exemple, des images) ou sur toutes les demandes.

62
Ali Dehghani

Un HandlerInterceptor vous donne un contrôle plus fin qu'un filtre, car vous avez accès au "gestionnaire" cible réel. Cela signifie que toute action que vous effectuez peut varier en fonction de la requête (alors que le filtre de servlet est appliqué de manière générique). à toutes les demandes - ne peut prendre en compte que les paramètres de chaque demande). HandlerInterceptor fournit également 3 méthodes différentes, de sorte que vous pouvez appliquer un comportement avant d'appeler un gestionnaire, une fois le gestionnaire terminé, mais avant le rendu de la vue (où vous pouvez même ignorer complètement le rendu de la vue) ou après le rendu de la vue elle-même. En outre, vous pouvez configurer différents intercepteurs pour différents groupes de gestionnaires - les intercepteurs sont configurés sur le gestionnaire handlerMapping et il peut y avoir plusieurs gestionnaires handlerMappings.

Par conséquent, si vous avez besoin de créer quelque chose de complètement générique (par exemple, consigner toutes les demandes), un filtre suffit. Toutefois, si le comportement dépend du gestionnaire cible ou si vous souhaitez faire quelque chose entre la gestion de la demande et le rendu de la vue, HandlerInterceptor offre cette flexibilité.

Référence: http://static.springframework.org/sp...ng-interceptor

3
Satyam

Filtre: - Un filtre comme son nom l'indique est une classe Java exécutée par le conteneur de servlets pour chaque demande HTTP entrante et pour chaque réponse http. De cette façon, il est possible de gérer les demandes HTTP entrantes avant qu'elles n'atteignent la ressource, telles qu'une page JSP, un servlet ou une simple page statique; De la même manière, il est possible de gérer la réponse sortante HTTP après l'exécution de la ressource.

Interceptor: - Spring Les intercepteurs sont similaires aux filtres de servlet, mais ils agissent dans le contexte Spring. Ils sont donc très puissants pour gérer les requêtes et les réponses HTTP, mais ils peuvent implémenter un comportement plus sophistiqué car ils peuvent accéder à tout le contexte Spring.

3
Manas