Überblick und Notwendigkeit für das Delegieren von FilterProxy in Spring

Übersicht und Notwendigkeit der Delegierung von FilterProxy im Frühjahr

1. Überblick

DelegatingFilterProxy ist ein Servlet-Filter, mit dem die Steuerung anFilter-Klassen übergeben werden kann, die Zugriff auf den Spring-Anwendungskontext haben. Spring Security setzt stark auf diese Technik.

In diesem Tutorial werden wir es ausführlich behandeln.

2. DelegatingFilterProxy

Der Javadoc fürDelegatingFilterProxy gibt an, dass es sich um a handelt

Proxy für einen Standard-Servlet-Filter, der an eine Spring-Managed-Bean delegiert, die die Filter-Schnittstelle implementiert.

Wenn wir Servlet-Filter verwenden, müssen wir sie in unserer Java-Konfiguration offensichtlich alsfilter-class oder alsweb.xml deklarieren. Andernfalls werden sie vom Servlet-Container ignoriert. DelegatingFilterProxyvon Spring stellt die Verbindung zwischenweb.xml und dem Anwendungskontext her.

2.1. Interne Arbeitsweise von DelegatingFilterProxy

Schauen wir uns an, wieDelegatingFilterProxy die Kontrolle auf unsere Spring Bean überträgt.

Während der Initialisierung ruftDelegatingFilterProxy diefilter-name ab und ruft die Bean mit diesem Namen aus dem Spring Application Context ab. Diese Bohne muss vom Typjavax.Servlet.Filter, ein. ein "normaler" Servlet-Filter. Eingehende Anfragen werden dann an diese Filterbean weitergeleitet.

Kurz gesagt, die MethodeDelegatingFilterProxy’sdoFilter()delegiert alle Aufrufe an eine Spring-Bean, sodass wir alle Spring-Funktionen in unserer Filter-Bean verwenden können.

Wenn wir eine Java-basierte Konfiguration verwenden, wird unsere Filterregistrierung inApplicationInitializer wie folgt definiert:

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

Wenn wir XML verwenden, dann in derweb.xml-Datei:


    applicationFilter
    org.springframework.web.filter.DelegatingFilterProxy

Dies bedeutet, dass jede Anforderung gestellt werden kann, den als Spring Bean definierten Filter mit dem NamenapplicationFilter zu durchlaufen.

2.2. Bedarf anDelegatingFilterProxy

DelegatingFilterProxy ist eine Klasse im Webmodul von Spring. Es bietet Funktionen, mit denen HTTP-Anrufe durch Filter geleitet werden können, bevor das eigentliche Ziel erreicht wird. Mit Hilfe vonDelegatingFilterProxy, kann eine Klasse, die diejavax.Servlet.Filter -Sinterschnittstelle implementiert, in die Filterkette verdrahtet werden.

Spring Security verwendet beispielsweiseDelegatingFilterProxy, um die Abhängigkeitsinjektionsfunktionen und Lebenszyklusschnittstellen von Spring für Sicherheitsfilter zu nutzen.

DelegatingFilterProxy nutzt auch das Aufrufen bestimmter oder mehrerer Filter gemäß Anforderungs-URI-Pfaden, indem die Konfiguration im Anwendungskontext von Spring oder inweb.xml. bereitgestellt wird

3. Erstellen eines benutzerdefinierten Filters

Wie oben beschrieben, istDelegatingFilterProxy ein Servlet-Filter selbst, der an eine bestimmte Spring-verwaltete Bean delegiert, die dieFilter-Schnittstelle implementiert.

In den nächsten Abschnitten erstellen wir einen benutzerdefinierten Filter und konfigurieren ihn mithilfe der Java- und XML-basierten Konfiguration.

3.1. Filterklasse

Wir werden einen einfachen Filter erstellen, der Anforderungsinformationen protokolliert, bevor die Anforderung fortgesetzt wird.

Erstellen wir zunächst eine benutzerdefinierte Filterklasse:

@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 implementiertjavax.Servlet.Filter. Diese Klasse verfügt über eine@Component-Annotation, die im Anwendungskontext als Spring Bean registriert werden soll. Auf diese Weise kann dieDelegatingFilterProxy-Klasse unsere Filterklasse finden, während die Filterkette initialisiert wird.

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 , weil die Klasse vonthe DelegatingFilterProxyim Anwendungskontext nach der Filter-Bean mit genau demselben Namen sucht.

Wenn keine Bean mit diesem Namen gefunden werden kann, wird beim Start der Anwendung eine Ausnahme ausgelöst.

3.2. Konfigurieren des Filters über die Java-Konfiguration

Um einen benutzerdefinierten Filter mithilfe der Java-Konfiguration zu registrieren, müssen Sie diegetServletFilters()-Methode vonAbstractAnnotationConfigDispatcherServletInitializer überschreiben:

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. Konfigurieren des Filters überweb.xml

Mal sehen, wie die Filterkonfiguration inweb.xml aussieht:


    loggingFilter
    org.springframework.web.filter.DelegatingFilterProxy


    loggingFilter
    /*

Das Argumentfilter-class ist vom TypDelegatingFilterProxy und nicht die von uns erstellte Filterklasse. Wenn wir diesen Code ausführen und eine URL drücken, wird diedoFilter()-Methode derCustomFilter ausgeführt und zeigt die Details der Anforderungsinformationen in der Protokolldatei an.

4. Fazit

In diesem Artikel haben wir erläutert, wieDelegatingFilterProxyfunktioniert und wie es verwendet wird.

Spring Security verwendetDelegatingFilterProxy in großem Umfang, um die Web-API-Aufrufe und -Ressourcen vor unbefugtem Zugriff zu schützen.

Der Quellcode istover on GitHub verfügbar.