Je me demande s'il y a une annotation pour une Filter
classe (pour les applications Web) dans Spring Boot? Peut @Filter
- être ?
Je veux ajouter un filtre personnalisé dans mon projet.
Le Guide de référence de Spring Boot en a parlé
FilterRegistrationBean
, mais je ne sais pas comment l'utiliser.
java
configuration
spring-boot
servlet-filters
janetsmith
la source
la source
Réponses:
Si vous souhaitez configurer un filtre tiers, vous pouvez l'utiliser
FilterRegistrationBean
. Par exemple l'équivalent de web.xmlCe seront les deux beans de votre
@Configuration
fichierCe qui précède a été testé avec Spring-boot 1.2.3
la source
someFilter()
directement la méthode .Voici un exemple d'une méthode pour inclure un filtre personnalisé dans une application Spring Boot MVC. Assurez-vous d'inclure le package dans une analyse des composants:
la source
MetricsFilter
, mais ce bean sera éclipsé par le bean actionneur Spring du même nom.Il n'y a pas d'annotation spéciale pour désigner un filtre de servlet. Vous déclarez simplement un
@Bean
typeFilter
(ouFilterRegistrationBean
). Un exemple (en ajoutant un en-tête personnalisé à toutes les réponses) se trouve dans la propre EndpointWebMvcAutoConfiguration de Boot ;Si vous déclarez seulement un,
Filter
il sera appliqué à toutes les demandes. Si vous ajoutez également un,FilterRegistrationBean
vous pouvez également spécifier des servlets individuels et des modèles d'URL à appliquer.Remarque:
À partir de Spring Boot 1.4,
FilterRegistrationBean
n'est pas obsolète et déplace simplement les packages deorg.springframework.boot.context.embedded.FilterRegistrationBean
versorg.springframework.boot.web.servlet.FilterRegistrationBean
la source
Filter
sur votre chemin de classe. Normalement, j'utiliserais juste lespring-boot-starter-web
pour tirer toutes les dépendances pertinentes (par exemple ici ).Il existe trois façons d'ajouter votre filtre,
@Component
@Bean
avecFilter
type Spring@Configuration
@Bean
avecFilterRegistrationBean
Spring@Configuration
Soit # 1 ou # 2 fera l'affaire si vous voulez que votre filtre s'applique à toutes les demandes sans personnalisation, utilisez # 3 sinon. Vous n'avez pas besoin de spécifier l'analyse des composants pour que # 1 fonctionne tant que vous placez votre classe de filtre dans le même ou sous-package de votre
SpringApplication
classe. Pour le n ° 3, l'utilisation avec le n ° 2 n'est nécessaire que lorsque vous souhaitez que Spring gère votre classe de filtre, comme par exemple les dépendances câblées automatiquement. Cela fonctionne très bien pour moi de nouveau mon filtre qui ne nécessite aucun câblage / injection de dépendance.Bien que la combinaison des # 2 et # 3 fonctionne bien, j'ai été surpris que cela ne se termine pas avec deux filtres appliquant deux fois. Je suppose que Spring combine les deux beans comme un seul lorsqu'il appelle la même méthode pour créer les deux. Si vous souhaitez utiliser le # 3 seul avec le câblage automatique, vous pouvez
AutowireCapableBeanFactory
. Ce qui suit est un exemple,la source
Filter
en utilisantFilterRegistrationBean
MISE À JOUR: 16/12/2017:
Il existe 2 façons simples de le faire dans Spring Boot 1.5.8.RELEASE, pas besoin de XML.
Première façon: si vous n'avez pas de modèle d'URL spatial, vous pouvez utiliser @Component comme ceci: (Le code complet et les détails sont ici https://www.surasint.com/spring-boot-filter/ )
Deuxième façon: si vous souhaitez utiliser des modèles d'URL, vous pouvez utiliser @WebFilter comme ceci: (Le code complet et les détails sont ici https://www.surasint.com/spring-boot-filter-urlpattern/ )
Mais vous devez également ajouter l'annotation @ServletComponentScan dans votre classe @SpringBootApplication:
Notez que @Component est l'annotation de Spring, mais pas @WebFilter. @WebFilter est une annotation Servlet 3.
Dans les deux cas, vous avez juste besoin de la dépendance de base Spring Boot dans pom.xml (pas besoin de jasper Tomcat intégré explicite)
AVERTISSEMENT: la première façon, si le contrôleur dans Spring Boot revient à un fichier JSP, la demande passera le filtre deux fois.
Alors que, dans le second cas, la demande ne passera le filtre qu'une seule fois.
Je préfère la deuxième façon car elle est plus similaire au comportement par défaut dans la spécification Servlet ( https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html )
Vous pouvez voir plus de journal de test ici https://www.surasint.com/spring-boot-webfilter-instead-of-component/
la source
Filter
interface être appelée plusieurs fois lors du lancement de l'applicationContext. Existe-t-il un moyen de l'exécuter une seule fois?Voici un exemple de ma classe de filtre personnalisée:
Et je l'ai ajouté à la configuration de démarrage Spring en l'ajoutant à la classe Configuration comme suit:
la source
Depuis Spring docs,
Conteneurs de servlet intégrés - Ajouter un servlet, un filtre ou un écouteur à une application
Par exemple:
Ajoutez cette
@Bean
configuration à votre@Configuration
classe et le filtre sera enregistré au démarrage.Vous pouvez également ajouter des servlets, des filtres et des écouteurs à l'aide de l'analyse des chemins de classe,
la source
Si vous utilisez Spring Boot + Spring Security, vous pouvez le faire dans la configuration de sécurité.
Dans l'exemple ci-dessous, j'ajoute un filtre personnalisé avant le nom d'utilisateurPasswordAuthenticationFilter (voir tous les filtres Spring Security par défaut et leur ordre ).
Et la classe de filtre
la source
En utilisant l'annotation @WebFilter, cela peut être fait comme suit:
la source
Nous avons environ quatre options différentes pour enregistrer un filtre à l'aide de Spring .
Tout d'abord, nous pouvons créer un bean Spring implémentant un filtre ou étendant HttpFilter :
Deuxièmement, nous pouvons créer un bean Spring étendant GenericFilterBean :
Alternativement, nous pouvons utiliser la classe FilterRegistrationBean :
Et nous pouvons enfin utiliser l' @WebFilter annotation avec @ServletComponentScan :
la source
C'est plus un conseil qu'une réponse, mais si vous utilisez un Spring MVC dans votre application Web, la bonne idée est d'utiliser Spring HandlerInterceptor au lieu de Filter
Il peut faire le même travail, mais aussi - Peut fonctionner avec ModelAndView - Ses méthodes peuvent être appelées avant et après le traitement de la demande, ou après l'achèvement de la demande.
- Il peut être facilement testé
1 Implémentez l'interface HandlerInterceptor et ajoutez une annotation @Component à votre classe
2 Configurez votre intercepteur
la source
Ce filtre vous aidera également à autoriser l'accès à l'origine croisée
la source
Vous pouvez utiliser @WebFilter javax.servlet.annotation.WebFilter sur une classe qui implémente javax.servlet.Filter
Utilisez ensuite @ServletComponentScan pour vous inscrire
la source
J'ai vu beaucoup de réponses ici mais je n'en ai essayé aucune. Je viens de créer le filtre comme dans le code suivant.
Et a laissé l'application Spring Boot restante telle qu'elle était.
la source
Vous avez besoin de 2 choses principales: - Ajouter
@ServletComponentScan
à votre classe principale - vous pouvez ajouter un package nommé filtre à l'intérieur, vous créez uneFilter
classe qui a les éléments suivants:la source
vous pouvez également créer un filtre en utilisant @WebFilter et implémente Filter, il le fera.
la source
Filtres comme le nom le suggère, utilisés pour effectuer un filtrage sur la demande adressée à une ressource ou sur la réponse d'une ressource, ou les deux. Spring Boot fournit quelques options pour enregistrer des filtres personnalisés dans l'application Spring Boot. Examinons les différentes options.
1. Définir le filtre de démarrage de Spring et l'ordre d'invocation
Implémentez l'interface de filtre pour créer un nouveau filtre dans Spring Boot.
Examinons rapidement certains points importants du code ci-dessus
Pour déclencher des filtres dans le bon ordre, nous devions utiliser l' annotation @Order .
Dans le code ci-dessus, CustomFirstFilter s'exécutera avant CustomSecondFilter.
2. Modèle d'URL
Si le mappage basé sur les conventions n'est pas suffisamment flexible, nous pouvons utiliser FilterRegistrationBean pour le contrôle complet de l'application. Ici, n'utilisez pas d' annotation @Component pour la classe de filtre mais enregistrez le filtre à l'aide d'un FilterRegistrationBean .
Enregistrez le filtre personnalisé à l'aide de FilterRegistrationBean .
la source
Vous devez implémenter Filter et devez être annoté avec @WebFilter (urlPatterns = "/ *")
Et dans la classe Application ou Configuration, vous devez ajouter @ServletComponentScan Par cela, votre filtre sera enregistré.
la source
@WebFilter
n'est que depuis Servlet 3.0. Donc, cela pourrait ne pas fonctionner correctement pour le 2.5Étape 1: créez un composant de filtre en implémentant l'interface de filtre.
Étape 2: définissez ce filtre sur les modèles d'URI à l'aide de FilterRegistrationBean.
Vous pouvez renvoyer ce lien pour une demande complète.
la source
Tout d'abord, ajoutez
@ServletComponentScan
à votre classe SpringBootApplication.Deuxièmement, créez un fichier de filtre étendant Filter ou une classe de filtre tierce et ajoutez
@WebFilter
à ce fichier comme ceci:la source
J'ai vu la réponse de @Vasily Komarov. Approche similaire, mais en utilisant la classe abstraite HandlerInterceptorAdapter au lieu d'utiliser HandlerInterceptor .
Voici un exemple...
la source
Comme vous le savez tous, Spring Boot est une merveilleuse façon de développer une WebApp ou StandaloneApp avec une configuration minimale et une configuration réfléchie.
Voici comment j'ai réalisé un développement de filtre Web dans une application Spring Boot
Version Spring Boot: 2.0.4.RELEASE
Version Java: 8.0
Spécification du servlet : Servlet 3.0 (obligatoire et important)
J'ai déclaré mon filtre Web de la manière suivante, en respectant les spécifications de la servlet 3.0
Il s'agit de la manière programmatique de définir un filtre en remplacement des définitions basées sur web.xml.
L'annotation "@Webfilter" sera traitée par le conteneur pendant le déploiement, la classe Filter dans laquelle elle se trouve sera créée selon la configuration et appliquée aux modèles d'URL, javax.servlet.Servlets et javax.servlet.DispatcherTypes.
Pour déployer Spring Boot Application en tant que «WAR traditionnel», la classe d'application doit étendre SpringBootServletInitializer.
REMARQUE :: SpringBootServletInitializer est une "implémentation programmatique" de web.xml en référence aux spécifications Servlet 3.0+, qui nécessitent une implémentation de WebApplicationInitializer.
Ainsi, SpringBootApplication ne nécessite pas "web.xml" car sa classe Application (après extension de SpringBootServletInitializer) recherche
- @WebFilter,
- @WebListener et
- @WebServlet.
Cette annotation permet d'analyser les packages de base pour les composants Web annotés avec @WebFilter, @WebListener et @WebServlet.
Étant donné que les conteneurs incorporés ne prennent pas en charge les annotations @WebServlet, @WebFilter et @WebListener, Spring Boot, s'appuyant fortement sur les conteneurs incorporés, a introduit cette nouvelle annotation @ServletComponentScan pour prendre en charge certains pots dépendants qui utilisent ces 3 annotations.
L'analyse n'est effectuée que lors de l'utilisation d'un conteneur de servlet intégré.
Ici: J'ai défini une classe personnalisée: "ServletInitializer" qui étend la classe: SpringBootServletInitializer.
Comme expliqué précédemment, SpringBootServletInitializer est responsable de l'analyse des annotations: -
- @WebFilter,
- @WebListener et
- @WebServlet.
Et donc la classe d'application Spring Boot devrait
la source
Les filtres sont principalement utilisés dans les fichiers logger, cela varie en fonction du logger que vous utilisez dans le projet Lemme expliquer pour log4j2:
Les filtres sont utilisés pour restreindre les données et j'ai utilisé un filtre de seuil pour restreindre davantage les niveaux de données dans le flux J'ai mentionné les niveaux qui peuvent être restreints là-bas. Pour votre réfrence supplémentaire, voir l'ordre des niveaux de log4j2 - Log4J Levels: ALL> TRACE> DEBUG> INFO> WARN> ERROR> FATAL> OFF
la source
FilterRegistrationBean
comme mentionné dans la question est pourjavax.servlet.Filter
, cette réponse parle deorg.apache.logging.log4j.core.Filter