[JAVA] Utiliser le filtre de servlet avec Spring Boot [compatible Spring Boot 1.x, 2.x]

environnement

2018-03-09 Addendum Le même comportement a été obtenu lors de la mise à niveau vers Spring Boot 2.0.0.RELEASE.

20/12/2018 postscript Ajout de l'explication de Spring Boot 2.1.

Méthode d'enregistrement de base du filtre

Utilisez la classe FilterRegistrationBean fournie par Spring Boot. Lorsque vous définissez un FilterRegistrationBean, le filtre est récupéré dans la classe de configuration automatique de Spring Boot et enregistré auprès du serveur intégré.

@Configuration
public class SomeConfig {

    @Bean
    public FilterRegistrationBean hogeFilter() {
        //Nouveau filtre et transmettez-le au constructeur FilterRegistrationBean
        FilterRegistrationBean bean = new FilterRegistrationBean(new HogeFilter());
        //URL du filtre-Spécifiez le modèle (plusieurs spécifications peuvent être spécifiées car il s'agit d'un argument de longueur variable)
        bean.addUrlPatterns("/*");
        //Ordre d'exécution du filtre. Effectué pour viser des valeurs entières
        bean.setOrder(Integer.MIN_VALUE);
        return bean;
    }

    @Bean
    public FilterRegistrationBean fugaFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean(new FugaFilter());
        bean.addUrlPatterns("/*");
        //Exécuté après HogeFilter
        bean.setOrder(Integer.MIN_VALUE + 1);
        return bean;
    }

    //N'importe quel nombre de filtres peut être défini
}

Utiliser d'autres haricots dans le filtre

La méthode @ Bean peut accepter d'autres beans comme arguments. C'est une fonctionnalité que Spring a à l'origine. C'est OK si vous recevez le Bean reçu en argument avec le constructeur de Filter.

public class HogeFilter extends OncePerRequestFilter { //Bien sûr, "implements Filter" est également OK
    private final FugaBean fugaBean; //Créer un champ

    public HogeFilter(FugaBean fugaBean) { //Recevoir un bean dans le constructeur
        this.fugaBean = fugaBean;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
        //Écrivez le prétraitement ici
        chain.doFilter(request, response);
        //Écrivez le post-traitement ici
    }
}
@Configuration
public class HogeConfig {

    @Bean
    public FilterRegistrationBean hogeFilter(FugaBean fugaBean) {
        //Passez le bean au constructeur Filter
        FilterRegistrationBean bean = new FilterRegistrationBean(new HogeFilter(fugaBean));
        // ...
        return bean;
    }
}

Le FugaBean doit être défini ailleurs (comme une autre classe Config ou une analyse de composant).

Notez que le filtre lui-même n'est pas un bean. Autrement dit, vous ne pouvez pas DI un bean vers un filtre avec @ Autowired ou appliquer un AOP à un filtre.

Voir la liste de l'ordre des applications de tous les filtres

Il s'agit d'une classe appelée ServletContextInitializerBeans qui récupère le filtre de FilterRegistrationBean et l'enregistre auprès du serveur incorporé. C'est OK si vous sortez le journal DEBUG de cette classe (Remarque: journal TRACE après Spring Boot 2.1). Le filtre est exécuté dans l'ordre croissant de la valeur de ʻorder`.

application.properties


# Boot 2.Après 1 est trace au lieu de débogage
logging.level.org.springframework.boot.web.servlet.ServletContextInitializerBeans=debug

Sortie standard


...
2018-02-28 11:58:37.611 DEBUG 4323 --- [ost-startStop-1] o.s.b.w.s.ServletContextInitializerBeans : Added existing Filter initializer bean 'loggingFilter1'; order=-2147483648, resource=com.example.Application
2018-02-28 11:58:37.611 DEBUG 4323 --- [ost-startStop-1] o.s.b.w.s.ServletContextInitializerBeans : Added existing Filter initializer bean 'loggingFilter2'; order=-2147483647, resource=com.example.Application
2018-02-28 11:58:37.612 DEBUG 4323 --- [ost-startStop-1] o.s.b.w.s.ServletContextInitializerBeans : Added existing Filter initializer bean 'loggingFilter3'; order=-2147483646, resource=com.example.Application
2018-02-28 11:58:37.612 DEBUG 4323 --- [ost-startStop-1] o.s.b.w.s.ServletContextInitializerBeans : Added existing Servlet initializer bean 'dispatcherServletRegistration'; order=2147483647, resource=class path resource [org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration.class]
2018-02-28 11:58:37.638 DEBUG 4323 --- [ost-startStop-1] o.s.b.w.s.ServletContextInitializerBeans : Created Filter initializer for bean 'characterEncodingFilter'; order=-2147483648, resource=class path resource [org/springframework/boot/autoconfigure/web/HttpEncodingAutoConfiguration.class]
2018-02-28 11:58:37.638 DEBUG 4323 --- [ost-startStop-1] o.s.b.w.s.ServletContextInitializerBeans : Created Filter initializer for bean 'hiddenHttpMethodFilter'; order=-10000, resource=class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.class]
2018-02-28 11:58:37.638 DEBUG 4323 --- [ost-startStop-1] o.s.b.w.s.ServletContextInitializerBeans : Created Filter initializer for bean 'httpPutFormContentFilter'; order=-9900, resource=class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.class]
2018-02-28 11:58:37.638 DEBUG 4323 --- [ost-startStop-1] o.s.b.w.s.ServletContextInitializerBeans : Created Filter initializer for bean 'requestContextFilter'; order=-105, resource=class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]
...

Que faire si le filtre lui-même est défini comme un bean?

Il est normal de définir le filtre lui-même comme un bean, mais je ne peux pas spécifier le modèle d'url ou l'ordre d'exécution. Il semble que même si vous spécifiez l'annotation @ Order dans la méthode @ Bean, elle sera ignorée (quelle que soit la valeur de @ Order, la valeur de la sortie de la commande dans le journal sera 2147483647).

    @Bean
    @Order(Integer.MIN_VALUE) //Cette valeur semble être ignorée (je ne sais pas s'il s'agit d'une spécification)
    public HogeFilter hogeFilter() {
        return new HogeFilter();
    }

Alors utilisons FilterRegistrationBean.

Matériel de référence

Spring Boot Reference https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners-beans Javadoc https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/web/servlet/FilterRegistrationBean.html

Recommended Posts

Utiliser le filtre de servlet avec Spring Boot [compatible Spring Boot 1.x, 2.x]
Utiliser la méthode de requête DynamoDB avec Spring Boot
DI SessionScope Bean dans le filtre Spring Boot 2
Utiliser le cache avec EhCashe 2.x avec Spring Boot
Mappage du servlet Spring Boot
Utilisez Interceptor au printemps
SSO avec GitHub OAuth dans l'environnement Spring Boot 1.5.x
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Définir le paramètre contextuel dans Spring Boot
Spring Boot + Springfox springfox-boot-starter 3.0.0 Utilisation
Utiliser Spring JDBC avec Spring Boot
Changements majeurs dans Spring Boot 1.5
NoHttpResponseException dans Spring Boot + WireMock
Spring Boot 1.x atteindra EOL l'année prochaine.
Comment appeler et utiliser l'API en Java (Spring Boot)
Utilisez thymeleaf3 avec le parent sans spécifier spring-boot-starter-parent dans Spring Boot
Utilisez @ControllerAdvice, @ExceptionHandler, HandlerExceptionResolver dans Spring Boot pour intercepter les exceptions
Connectez-vous avec HttpServletRequest # login dans Spring Security dans l'environnement Servlet 3.x
Comment utiliser Lombok au printemps
Paramètres du chemin de contexte Spring Boot 2.x
Utiliser l'authentification de base avec Spring Boot
Spring Boot Hello World dans Eclipse
Développement d'applications Spring Boot dans Eclipse
Écrire du code de test avec Spring Boot
Record de lutte pour Cassandra x Spring Boot
Implémenter l'API REST avec Spring Boot
Qu'est-ce que @Autowired dans Spring Boot?
Utiliser DBUnit pour le test Spring Boot
Implémenter l'application Spring Boot dans Gradle
Comment utiliser ModelMapper (Spring boot)
À partir de Spring Boot 0. Utilisez Spring CLI
Comment utiliser Thymeleaf avec Spring Boot
Lancer un (ancien) projet Spring Boot avec IntelliJ
Créer une image Spring Boot + Docker avec Gradle
Priorité d'accès aux fichiers statiques dans Spring Boot
Sortie du journal Spring Boot au format json
Mémorandum de téléchargement de fichier local avec Spring Boot
Créer un projet Java Spring Boot avec IntelliJ
Desserrer la vérification de la syntaxe de Thymeleaf dans Spring Boot
[Entraine toi! ] Affichez Hello World avec Spring Boot
Fonctionnement du servlet Dispatcher dans Spring MVC
Je veux utiliser @Autowired dans Servlet
Modifier le délai d'expiration de la session dans Spring Boot
Cookie SameSite dans Spring Boot (Spring Web MVC + Tomcat)
Testez le contrôleur avec Mock MVC dans Spring Boot
Traitement asynchrone avec exécution régulière dans Spring Boot
Utilisez le mode de modèle de texte Thymeleaf de Spring Boot
Exécuter un projet Spring Boot avec VS Code
Comment utiliser h2db intégré avec Spring Boot
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
Comment ajouter un chemin de classe dans Spring Boot
Conseils Java - Créez un projet Spring Boot avec Gradle
[Java] Hello World avec Java 14 x Spring Boot 2.3 x JUnit 5 ~
Comment se lier avec un fichier de propriétés dans Spring Boot
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
Annotations utilisées dans les outils de gestion des tâches Spring Boot
Procédure de construction de LINE Bot x Java (Spring Boot)
Afficher la tâche Gradle dans le projet Spring Boot
Défi Spring Boot
Forme de botte de printemps
Spring Boot Rappelez-vous