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