[JAVA] Servlet-Filter mit Spring Boot verwenden [Spring Boot 1.x, 2.x kompatibel]

Umgebung

Nachtrag 2018-03-09 Das gleiche Verhalten wurde nach dem Upgrade auf Spring Boot 2.0.0.RELEASE erzielt.

2018-12-20 Nachtrag Die Erklärung von Spring Boot 2.1 wurde hinzugefügt.

Grundlegende Filterregistrierungsmethode

Verwenden Sie die von Spring Boot bereitgestellte Klasse "FilterRegistrationBean". Wenn Sie eine FilterRegistrationBean definieren, wird der Filter in der Spring Boot Auto Configuration-Klasse abgerufen und beim eingebetteten Server registriert.

@Configuration
public class SomeConfig {

    @Bean
    public FilterRegistrationBean hogeFilter() {
        //Neuer Filter und übergeben Sie ihn an den FilterRegistrationBean-Konstruktor
        FilterRegistrationBean bean = new FilterRegistrationBean(new HogeFilter());
        //URL filtern-Muster angeben (mehrere Spezifikationen können angegeben werden, da es sich um ein Argument variabler Länge handelt)
        bean.addUrlPatterns("/*");
        //Ausführungsreihenfolge filtern. Wird ausgeführt, um auf ganzzahlige Werte zu zielen
        bean.setOrder(Integer.MIN_VALUE);
        return bean;
    }

    @Bean
    public FilterRegistrationBean fugaFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean(new FugaFilter());
        bean.addUrlPatterns("/*");
        //Wird nach HogeFilter ausgeführt
        bean.setOrder(Integer.MIN_VALUE + 1);
        return bean;
    }

    //Es können beliebig viele Filter definiert werden
}

Verwenden Sie andere Bohnen im Filter

Die @ Bean-Methode kann andere Beans als Argumente akzeptieren. Dies ist eine Funktion, die Spring ursprünglich hat. Es ist in Ordnung, wenn Sie die Bean erhalten, die als Argument mit dem Konstruktor von Filter empfangen wurde.

public class HogeFilter extends OncePerRequestFilter { //Natürlich ist "implementiert Filter" auch in Ordnung
    private final FugaBean fugaBean; //Feld erstellen

    public HogeFilter(FugaBean fugaBean) { //Erhalten Sie eine Bean im Konstruktor
        this.fugaBean = fugaBean;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
        //Schreiben Sie hier die Vorverarbeitung
        chain.doFilter(request, response);
        //Schreiben Sie hier die Nachbearbeitung
    }
}
@Configuration
public class HogeConfig {

    @Bean
    public FilterRegistrationBean hogeFilter(FugaBean fugaBean) {
        //Übergeben Sie die Bean an den Filterkonstruktor
        FilterRegistrationBean bean = new FilterRegistrationBean(new HogeFilter(fugaBean));
        // ...
        return bean;
    }
}

Die FugaBean muss an einer anderen Stelle Bean-definiert sein (z. B. in einer anderen Konfigurationsklasse oder einem Komponentenscan).

Beachten Sie, dass der Filter selbst keine Bean ist. Das heißt, Sie können mit @ Autowired keine Bean auf einen Filter verteilen oder einen AOP auf einen Filter anwenden.

Siehe die Liste der Anwendungsreihenfolge aller Filter

Es ist eine Klasse namens "ServletContextInitializerBeans", die Filter von "FilterRegistrationBean" abruft und bei Embedded Server registriert. Es ist in Ordnung, wenn Sie das DEBUG-Protokoll dieser Klasse ausgeben (Hinweis: TRACE-Protokoll nach Spring Boot 2.1). Der Filter wird in aufsteigender Reihenfolge des Wertes von "Reihenfolge" ausgeführt.

application.properties


# Boot 2.Nach 1 ist Trace statt Debug
logging.level.org.springframework.boot.web.servlet.ServletContextInitializerBeans=debug

Standardausgabe


...
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]
...

Was ist, wenn der Filter selbst als Bean definiert ist?

Es ist in Ordnung, den Filter selbst als Bean zu definieren, aber ich kann das URL-Muster oder die Ausführungsreihenfolge nicht angeben. Selbst wenn Sie die Annotation "@ Order" in der Methode "@ Bean" angeben, scheint sie ignoriert zu werden (unabhängig vom Wert von "@ Order" lautet der Wert der in das Protokoll ausgegebenen Bestellung "2147483647").

    @Bean
    @Order(Integer.MIN_VALUE) //Dieser Wert scheint ignoriert zu werden (nicht sicher, ob es sich um eine Spezifikation handelt).
    public HogeFilter hogeFilter() {
        return new HogeFilter();
    }

Verwenden wir also "FilterRegistrationBean".

Referenzmaterial

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

Servlet-Filter mit Spring Boot verwenden [Spring Boot 1.x, 2.x kompatibel]
Verwenden Sie die DynamoDB-Abfragemethode mit Spring Boot
DI SessionScope Bean im Spring Boot 2-Filter
Verwenden Sie den Cache mit EhCashe 2.x mit Spring Boot
Spring Boot Servlet-Zuordnung
Verwenden Sie Interceptor im Frühjahr
SSO mit GitHub OAuth in der Spring Boot 1.5.x-Umgebung
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Legen Sie den Kontextparameter in Spring Boot fest
Spring Boot + Springfox Springfox-Boot-Starter 3.0.0 Verwendung
Verwenden Sie Spring JDBC mit Spring Boot
Wichtige Änderungen in Spring Boot 1.5
NoHttpResponseException in Spring Boot + WireMock
Spring Boot 1.x wird im nächsten Jahr EOL erreichen.
Aufrufen und Verwenden der API in Java (Spring Boot)
Verwenden Sie thymeleaf3 mit parent, ohne Spring-Boot-Starter-Parent in Spring Boot anzugeben
Verwenden Sie im Spring Boot @ControllerAdvice, @ExceptionHandler, HandlerExceptionResolver, um Ausnahmen abzufangen
Melden Sie sich mit HttpServletRequest # in Spring Security in der Servlet 3.x-Umgebung an
Wie man Lombok im Frühling benutzt
Einstellungen für den Spring Boot 2.x-Kontextpfad
Verwenden Sie die Standardauthentifizierung mit Spring Boot
Frühlingsstiefel Hallo Welt in Eclipse
Spring Boot-Anwendungsentwicklung in Eclipse
Schreiben Sie den Testcode mit Spring Boot
Cassandra x Spring Boot Kampfrekord
Implementieren Sie die REST-API mit Spring Boot
Was ist @Autowired im Spring Boot?
Verwenden Sie DBUnit für den Spring Boot-Test
Implementieren Sie die Spring Boot-Anwendung in Gradle
Verwendung von ModelMapper (Spring Boot)
Beginnend mit Spring Boot 0. Verwenden Sie Spring CLI
Verwendung von Thymeleaf mit Spring Boot
Starten Sie mit IntelliJ ein (altes) Spring Boot-Projekt
Erstellen Sie mit Gradle ein Spring Boot + Docker-Image
Statische Dateizugriffspriorität beim Spring Boot
Spring Boot-Protokoll im JSON-Format ausgeben
Memorandum zum Herunterladen lokaler Dateien mit Spring Boot
Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt
Lösen Sie die Thymeleaf-Syntaxprüfung in Spring Boot
[Trainieren! ] Zeigen Sie Hello World mit Spring Boot an
Funktionsweise des Dispatcher-Servlets in Spring MVC
Ich möchte @Autowired in Servlet verwenden
Ändern Sie das Sitzungszeitlimit in Spring Boot
SameSite-Cookie im Spring Boot (Spring Web MVC + Tomcat)
Testen Sie den Controller mit Mock MVC im Spring Boot
Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot
Verwenden Sie den Thymeleaf-Textvorlagenmodus von Spring Boot
Führen Sie ein Spring Boot-Projekt mit VS-Code aus
Verwendung des eingebauten h2db mit Federstiefel
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
[Java] Hallo Welt mit Java 14 x Spring Boot 2.3 x JUnit 5 ~
So binden Sie mit einer Eigenschaftendatei in Spring Boot
[JAVA] [Spring] [MyBatis] Verwenden Sie IN () mit SQL Builder
Anmerkungen, die in Spring Boot-Aufgabenverwaltungstools verwendet werden
Konstruktionsverfahren für LINE Bot x Java (Spring Boot)
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
Fordern Sie Spring Boot heraus
Spring Boot Form
Spring Boot Denken Sie daran