124 votes

Ce qui ' s au point de Spring MVC ' s DelegatingFilterProxy ?

Je vois cela dans mon Spring MVC de l'application web.xml:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

J'essaie de comprendre pourquoi il est là et si c'est vraiment nécessaire.

J'ai trouvé cette explication dans le Printemps docs mais il ne m'aide pas en comprendre le sens:

Il semble suggérer que cette composante est la "colle" entre les servlets définie en web.xml et les éléments définis dans le Ressort applicationContext.xml.

7.1 DelegatingFilterProxy

Lors de l'utilisation de servlet filtres, vous avez évidemment besoin de les déclarer dans votre web.xml, ou ils seront ignorés par le conteneur de servlet. Au Printemps de Sécurité, les classes de filtre sont également beans Spring définis dans le contexte de l'application et donc en mesure de profiter du Printemps est riche d'injection de dépendance des installations et du cycle de vie des interfaces. Le printemps de l' DelegatingFilterProxy assure le lien entre web.xml et le contexte de l'application.

Lors de l'utilisation de DelegatingFilterProxy, vous verrez quelque chose comme ceci dans l' web.xml le fichier:

<filter>
  <filter-name>myFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>myFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Notez que le filtre est en fait un DelegatingFilterProxy, et non pas la classe qui va effectivement mettre en œuvre la logique du filtre. Ce DelegatingFilterProxy n'est délégué du Filtre méthodes grâce à un haricot qui est obtenu à partir du Printemps contexte de l'application. Cela permet à la fève de bénéficier du Printemps contexte d'application web support du cycle de vie et la flexibilité de configuration. Le bean doit mettre en oeuvre javax.servlet.Filter et il doit avoir le même nom que dans le filtre-nom de l'élément. Lire la Javadoc pour DelegatingFilterProxy pour plus d'informations

Donc, si je prends ce de ma web.xml, ce qui va arriver? Mes servlets ne sera pas en mesure de communiquer avec le Printemps conteneur?**

130voto

jbbarquero Points 1514

Il y a une sorte de magie ici, mais à la fin, tout est déterministe programme.

Le DelegatingFilterProxy est un Filtre comme il a été expliqué ci-dessus, dont l'objectif est "de déléguer à un Printemps-managed bean qui implémente l'interface de Filtre", qui est, il trouve une fève ("cible bean" ou "délégué") dans votre Printemps contexte de l'application et l'appelle. Comment est-il possible? Parce que ce bean implémente javax.servlet.Filtre, sa doFilter méthode est appelée.

Haricots qui est appelé? le DelegatingFilterProxy "prend en charge un "targetBeanName" [...], en précisant le nom de la cible de haricot au Printemps contexte de l'application."

Comme vous l'avez vu dans votre web.xml que la fève est le nom de "springSecurityFilterChain".

Alors, dans le contexte d'une application web, un Filtre instancie un haricot appelé "springSecurityFilterChain" dans votre contexte de l'application, puis délégué par l'intermédiaire de l'doFilter() la méthode.

Rappelez-vous, votre contexte d'application est défini avec l'ENSEMBLE de L'APPLICATION de CONTEXTE (XML) des fichiers. Par exemple: applicationContext.xml ET applicationContext-security.xml.

Donc, essayez de trouver un haricot appelé "springSecurityFilterChain" dans le dernier...

...et probablement vous ne pouvez pas (par exemple si vous avez suivi un tutoriel ou si vous avez configuré la sécurité à l'aide de règles d'origine)

Ici, c'est la magie: il y a un élément nouveau pour la configuration de la sécurité, quelque chose comme

<http auto-config="true" use-expressions="true"> 

comme il est permis par http://www.springframework.org/schema/security/spring-security-3.0.xsd, fera l'affaire.

Quand le Printemps des charges le contexte de l'application à l'aide de fichiers XML, s'il trouve un élément, il va essayer de configurer la sécurité HTTP, qui est, une pile de filtres et protégé Url et d'enregistrer la FilterChainProxy nommé "springSecurityFilterChain".

Alternativement, vous pouvez définir la fève dans la voie classique, c'est:

<beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">

Mais c'est moins recommandé, car vous avez besoin de faire beaucoup de configuration (tous les filtres que vous allez utiliser. Et il y a plus d'une douzaine d'entre eux)

81voto

Ryan Stewart Points 46960

Savez-vous ce qu'est un Servlet Filtre est et comment il fonctionne? C'est un très utile morceau de la Servlet Spec, nous permettant d'appliquer AOP-comme les concepts de la maintenance des requêtes HTTP. De nombreux cadres de l'utilisation du Filtre d'implémentation de diverses choses, et il n'est pas rare de trouver des implémentations personnalisées d'entre eux parce qu'ils ont très simple à écrire et utile. Au Printemps de l'app, la plupart des choses que votre application peut faire est à votre beans Spring. Un Filtre instance, même si, est contrôlée par le conteneur de servlet. Le conteneur instancie, initialise, et la détruit. La Servlet Spec ne nécessite aucune sorte de Spring integration, cependant, de sorte que vous êtes de gauche avec un concept utile (Filtres) avec aucun moyen pratique de les lier à votre Ressort de l'app et les grains de faire le travail.

Entrez le DelegatingFilterProxy. Vous écrivez un Filtre de mise en œuvre et d'en faire un Ressort de haricot, mais au lieu d'ajouter votre propre classe de Filtre à l'web.xml vous utilisez le DelegatingFilterProxy, et donnez-lui le haricot nom de votre filtre dans le Ressort du contexte. (Si vous n'avez pas explicitement un nom, il utilise le "filtre-nom".) Puis au moment de l'exécution, la DelegatingFilterProxy gère la complexité de trouver la réelle mise en œuvre - celle que vous avez écrit et configuré dans le Printemps et l'acheminement des demandes. Donc, au moment de l'exécution, c'est comme si vous aviez mis votre filtre dans le web.xml, mais vous obtenez les avantages d'être en mesure de fil comme n'importe quel autre Printemps bean.

Si vous prenez ce filtre mappage de votre web.xml, tout va continuer à travailler, mais aucun de votre Url sera sécurisé. (En supposant que le nom de "springSecurityFilterChain" décrit avec précision ce qu'il fait.) C'est parce que cette cartographie est de filtrage de chaque demande entrante et de remettre à un filtre de sécurité définies dans votre printemps contexte.

54voto

Tahir Akhtar Points 5843

Servlet Filtres sont en général Java WebApp concept. Vous pouvez avoir servlet filtres webapp, si oui ou non vous utilisez le framework Spring dans votre application.

Ces filtres peuvent intercepter les demandes avant d'atteindre la cible de servlet. Vous pouvez mettre en œuvre des fonctionnalités communes, comme l'autorisation, dans le servlet filtres. Une fois mis en œuvre, vous pouvez configurer le filtre de votre web.xml pour être appliqués à des servlet, url de demande spécifique de schémas ou de tous les formats d'url.

Moderne web-apps peut avoir des douzaines de ces filtres. Des choses comme l'autorisation, la mise en cache, ORM gestion de session, l'injection de dépendance, etc. sont souvent mis en œuvre avec l'aide d'un filtre de servlet. Tous ces filtres doivent être enregistrés dans web.xml

Votre conteneur de servlet est responsable de la création des instances de ces enregistré des filtres et de les appeler au moment approprié (i-e lors de l'entretien de servlet demandes). Maintenant, si vous êtes comme la plupart de l'Injection de Dépendance (DI), les fans, vous auriez probablement dire que la création d'instances est ce que mon DI framework (Spring) fait mieux. Je ne peux pas obtenir mon servlet filtres créés avec le Printemps, de sorte qu'ils se prêtent à toutes les DI bonté?

C'est là que DelegatingFilterProxy étapes. Une fois que vous avez DelegatingFilterProxy vous pouvez déclarer le réel haricots qui ne le filtrage dans votre configuration spring. Notez que vous avez besoin d'un seul DelegatingFilterProxy déclaration en web.xml mais vous pouvez avoir plusieurs filtrage beans enchaînés dans votre contexte de l'application.

18voto

Bozho Points 273663

La chose est, filtres servlet sont gérés par le conteneur de servlet et pas de printemps. Et vous devrez injecter certains composants de printemps dans vos filtres.

Donc, si vous avez besoin de quelque chose comme :

vous devez ensuite le proxy filtre délégante.

1voto

Ritesh Points 2992

Vous avez raison à propos de la "colle" des choses. Comme écrit dans la documentation Javadoc de FilterChainProxy:

Le FilterChainProxy est liée dans le conteneur de servlet chaîne de filtrage par l'ajout d'un standard de Printemps DelegatingFilterProxy déclaration dans la demande web.xml fichier.

Veuillez voir FIlterChainProxy article de blog Derrière le Printemps de la Sécurité de l'espace de Noms pour une excellente explication.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X