wake-up-neo.net

Hinzufügen eines Servlet-Filters in einer Spring Boot-Anwendung

Ich hätte gerne ETag-Unterstützung . Zu diesem Zweck gibt es ein ShallowEtagHeaderFilter, das die ganze Arbeit erledigt. Wie kann ich es hinzufügen, ohne es in meinem web.xml Zu deklarieren?

P.S. Ich benutze Spring Boot 1.1.4

P.P.S. Hier ist eine vollständige Lösung

package cuenation.api;

import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.ShallowEtagHeaderFilter;

import javax.servlet.DispatcherType;
import Java.util.EnumSet;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean shallowEtagHeaderFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new ShallowEtagHeaderFilter());
        registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
        registration.addUrlPatterns("/cue-categories");
        return registration;
    }

}
20
dVaffection

Bei Verwendung von Spring Boot

Wie in der Referenzdokumentation erwähnt ist der einzige Schritt, den Filter als Bean in einer Konfigurationsklasse zu deklarieren, das war's!

@Configuration
public class WebConfig {

  @Bean
  public Filter shallowEtagHeaderFilter() {
    return new ShallowEtagHeaderFilter();
  }
}

Bei Verwendung von Spring MVC

Sie erweitern wahrscheinlich bereits ein WebApplicationInitializer. Wenn nicht, sollten Sie Ihre Webapp-Konfiguration von einer web.xml - Datei in eine WebApplicationInitializer -Klasse konvertieren.

Wenn sich Ihre Kontextkonfiguration in XML-Dateien befindet, können Sie eine Klasse erstellen, die AbstractDispatcherServletInitializer erweitert. Wenn Sie Konfigurationsklassen verwenden, ist AbstractAnnotationConfigDispatcherServletInitializer die richtige Wahl.

In jedem Fall können Sie dann eine Filterregistrierung hinzufügen:

  @Override
  protected Filter[] getServletFilters() {
    return new Filter[] {
      new ShallowEtagHeaderFilter();
    };
  }

Vollständige Beispiele für die codebasierte Servlet-Container-Initialisierung finden Sie in der Spring-Referenzdokumentation .

33
Brian Clozel

Eine etwas verspätete Antwort.

Meine Lösung bestand darin, benutzerdefinierte Anmerkungen zu erstellen:

import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

// ...

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface Filter {

    @AliasFor(annotation = Component.class, attribute = "value")
    String value() default "";

}

Und wenden Sie es dann einfach auf die Filterimplementierungen an:

@Filter
public class CustomFilter extends AbstractRequestLoggingFilter {

    @Override
    protected void beforeRequest(HttpServletRequest request, String message) {
        logger.debug("before req params:", request.getParameterMap());
    }

    @Override
    protected void afterRequest(HttpServletRequest request, String message) {
        logger.debug("after req params:", request.getParameterMap());
    }
}

Mehr sehen: @AliasFor , Frage zu benutzerdefinierten Anmerkungen im Frühjahr

2
Andrii Abramov