web-dev-qa-db-fra.com

Ajouter un filtre de servlet dans une application Spring Boot

J'aimerais avoir ETag suport . A cet effet, il existe un ShallowEtagHeaderFilter qui fait tout le travail. Comment puis-je l'ajouter sans le déclarer dans mon web.xml (qui n'existe pas vraiment, parce que je m'en suis sorti jusqu'à présent)?

P.S. J'utilise Spring Boot 1.1.4

P.P.S. Voici une solution complète

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

Lors de l'utilisation de Spring Boot

Comme mentionné dans la documentation de référence , la seule étape nécessaire est de déclarer ce filtre en tant que Bean dans une classe de configuration, c'est tout!

@Configuration
public class WebConfig {

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

Lors de l'utilisation de Spring MVC

Vous étendez probablement déjà un WebApplicationInitializer. Sinon, vous devez convertir votre configuration Webapp à partir d'un web.xml fichier dans une classe WebApplicationInitializer.

Si votre configuration de contexte réside dans des fichiers XML, vous pouvez créer une classe qui étend AbstractDispatcherServletInitializer - si vous utilisez des classes de configuration, AbstractAnnotationConfigDispatcherServletInitializer est le bon choix.

Dans tous les cas, vous pouvez ensuite ajouter l'enregistrement du filtre:

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

Exemples complets de l'initialisation du conteneur de servlet basée sur le code est disponible dans la documentation de référence de Spring .

33
Brian Clozel

Réponse un peu tardive.

Ma solution a été de créer des annotations personnalisées:

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 "";

}

Et puis appliquez-le simplement aux implémentations de filtre:

@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());
    }
}

Voir plus: @AliasFor , Question d'annotations personnalisées de printemps

2
Andrii Abramov