Vue d’ensemble et besoin de DelegatingFilterProxy au printemps

Présentation et besoin de DelegatingFilterProxy au printemps

1. Vue d'ensemble

LeDelegatingFilterProxy  est un filtre de servlet qui permet de passer le contrôle aux classesFilter qui ont accès au contexte de l'application Spring. Spring Security s'appuie fortement sur cette technique.

Dans ce didacticiel, nous allons le couvrir en détail.

2. DelegatingFilterProxy

Le Javadoc pourDelegatingFilterProxy indique qu'il s'agit d'un

Proxy pour un filtre de servlet standard, déléguant à un bean géré par Spring qui implémente l'interface de filtre.

Lorsque vous utilisez des filtres de servlet, nous devons évidemment les déclarer en tant quefilter-class dans notre configuration Java ouweb.xml, sinon, le conteneur de servlet les ignorera. LeDelegatingFilterProxy de Spring fournit le lien entreweb.xml et le contexte de l'application.

2.1. Fonctionnement interne de DelegatingFilterProxy

Voyons commentDelegatingFilterProxy transfère le contrôle à notre haricot printanier.

Lors de l'initialisation,DelegatingFilterProxy récupère lesfilter-name et récupère le bean portant ce nom dans Spring Application Context. Ce bean doit être de typejavax.Servlet.Filter, i.e. un filtre de servlet «normal». Les demandes entrantes seront ensuite transmises à ce filtre.

En bref, la méthodeDelegatingFilterProxy’sdoFilter() déléguera tous les appels à un bean Spring, ce qui nous permettra d'utiliser toutes les fonctionnalités de Spring dans notre bean filtre.

Si nous utilisons une configuration basée sur Java, notre enregistrement de filtre dansApplicationInitializer sera défini comme:

@Override
protected javax.servlet.Filter[] getServletFilters() {
    DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy();
    delegateFilterProxy.setTargetBeanName("applicationFilter");
    return new Filter[]{delegateFilterProxy};
}

Si nous utilisons XML, alors, dans le fichierweb.xml:


    applicationFilter
    org.springframework.web.filter.DelegatingFilterProxy

Cela signifie que toute demande peut être faite pour passer à travers le filtre défini comme Spring bean avec le nomapplicationFilter.

2.2. Besoin deDelegatingFilterProxy

DelegatingFilterProxy est une classe du module Web de Spring. Il fournit des fonctionnalités permettant de faire passer les appels HTTP à travers des filtres avant d’atteindre la destination réelle. Avec l'aide deDelegatingFilterProxy,, une classe implémentant l'interfacejavax.Servlet.Filter peut être câblée dans la chaîne de filtres.

Par exemple, Spring Security utiliseDelegatingFilterProxy pour pouvoir tirer parti des fonctionnalités d'injection de dépendances et des interfaces de cycle de vie de Spring pour les filtres de sécurité.

DelegatingFilterProxy exploite également l'appel de filtres spécifiques ou multiples selon les chemins d'URI de requête en fournissant la configuration dans le contexte d'application de Spring ou dansweb.xml.

3. Créer un filtre personnalisé

Comme décrit ci-dessus,DelegatingFilterProxy est un filtre de servlet lui-même qui délègue à un bean géré par Spring spécifique qui implémente l'interfaceFilter.

Dans les prochaines sections, nous allons créer un filtre personnalisé et le configurer à l'aide d'une configuration Java et XML.

3.1. Classe de filtre

Nous allons créer un filtre simple qui enregistre les informations de la demande avant que la demande ne continue.

Commençons par créer une classe de filtre personnalisée:

@Component("loggingFilter")
public class CustomFilter implements Filter {

    private static Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class);

    @Override
    public void init(FilterConfig config) throws ServletException {
        // initialize something
    }

    @Override
    public void doFilter(
      ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        LOGGER.info("Request Info : " + req);
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // cleanup code, if necessary
    }
}

CustomFilter implémentejavax.Servlet.Filter. Cette classe a une annotation@Component à enregistrer en tant que Spring bean dans le contexte de l'application. De cette façon, la classeDelegatingFilterProxy peut trouver notre classe de filtre lors de l'initialisation de la chaîne de filtres.

Note that the name of the Spring bean must be the same as the value in the filter-name provided during the registration of the custom filter in ApplicationInitializer class or in web.xml later  parce que la classethe DelegatingFilterProxy recherchera le bean filtre avec exactement le même nom dans le contexte de l'application.

S'il ne trouve pas de bean portant ce nom, il lèvera une exception au démarrage de l'application.

3.2. Configuration du filtre via la configuration Java

Pour enregistrer un filtre personnalisé à l'aide de la configuration Java, nous devons remplacer la méthodegetServletFilters() deAbstractAnnotationConfigDispatcherServletInitializer:

public class ApplicationInitializer
  extends AbstractAnnotationConfigDispatcherServletInitializer {
    // some other methods here

    @Override
    protected javax.servlet.Filter[] getServletFilters() {
        DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy();
        delegateFilterProxy.setTargetBeanName("loggingFilter");
        return new Filter[]{delegateFilterProxy};
    }
}

3.3. Configuration du filtre viaweb.xml

Voyons à quoi ressemble la configuration du filtre dansweb.xml:


    loggingFilter
    org.springframework.web.filter.DelegatingFilterProxy


    loggingFilter
    /*

L'argumentfilter-class est de typeDelegatingFilterProxy et non la classe de filtre que nous avons créée. Si nous exécutons ce code et frappons une URL, alors la méthodedoFilter() desCustomFilter sera exécutée et affichera les détails des informations de demande dans le fichier journal.

4. Conclusion

Dans cet article, nous avons expliqué comment fonctionneDelegatingFilterProxy et comment l'utiliser.

Spring Security utilise largementDelegatingFilterProxy pour sécuriser les appels et les ressources de l'API Web contre les accès non autorisés.

Le code source est disponibleover on GitHub.