Ü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.