web-dev-qa-db-fra.com

Spring HandlerInterceptor vs Servlet Filtres

HandlerInterceptor s dans Spring peut désormais être configuré pour être appelé uniquement sur certaines URL à l'aide de <mvc:interceptors>.

Les filtres de servlet peuvent atteindre les mêmes fonctionnalités (journalisation, sécurité, etc.). Alors, lequel devrait être utilisé?

Je pense qu'avec les intercepteurs, on peut utiliser l'objet ModelAndView pour travailler avec les modèles, donc il a plus d'avantages. Quelqu'un peut-il dessiner des scénarios où les filtres ou les intercepteurs ont des avantages par rapport à l'autre?

63
aces.

Le org.springframework.web.servlet.HanderInterceptor Interface JavaDoc lui-même a deux paragraphes qui discutent de cette question:

HandlerInterceptor est fondamentalement similaire à un filtre Servlet 2.3, mais contrairement à ce dernier, il permet uniquement 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, par exemple, ils permettent d'échanger les objets de demande et de réponse transmis le long de 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 affinées liées au gestionnaire sont des candidats pour les implémentations de HandlerInterceptor, en particulier le code de gestionnaire commun et les vérifications d'autorisation. D'un autre côté, un filtre est bien adapté au contenu des requêtes et à la gestion du contenu des vues, comme les formulaires en plusieurs parties et la compression GZIP. Cela montre généralement quand il faut mapper le filtre à certains types de contenu (par exemple, des images) ou à toutes les demandes.

58
Ralph

Les intercepteurs Spring Handler vous permettent de vous connecter à davantage de parties du cycle de vie de la demande et d'accéder à plus d'informations dans le processus. Ils sont souvent plus intimement liés au cycle de demande/réponse que les filtres.

Les filtres conviennent mieux lorsque vous traitez votre demande/réponse comme un système de boîte noire. Ils fonctionneront quelle que soit la façon dont la servlet est implémentée.

Si vous utilisez Spring MVC, il n'y a aucune raison d'écrire une nouvelle logique comme filtre de servlet. Tout ce que les filtres peuvent faire, les intercepteurs peuvent le faire plus facilement et plus élégamment.

N'oubliez pas que les filtres de servlet existent depuis bien plus longtemps que les intercepteurs.

25
skaffman

Avec un intercepteur Spring, vous avez accès au gestionnaire qui peut être utile. De plus, avec un intercepteur Spring, vous avez accès à l'exécution de la logique avant le rendu de la vue et après le rendu de la vue.

4
smp7d