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

1. Übersicht

Die DelegatingFilterProxy ist ein Servlet - Filter , die Übergabe der Steuerung zu können Filter - Klassen , den Zugriff auf den Spring - Anwendungskontext haben. Spring Security verlässt sich stark auf diese Technik.

In diesem Tutorial werden wir es im Detail behandeln.

2. DelegatingFilterProxy

Das Javadoc für DelegatingFilterProxy gibt an, dass es ein

Proxy für einen Standard-Servlet-Filter, der an eine von Spring verwaltete Bean delegiert wird, die die Filterschnittstelle implementiert.

Wenn Sie Servlet-Filter verwenden, müssen Sie diese natürlich in unserer Java-Konfiguration oder in der Datei web.xml als Filterklasse deklarieren. Andernfalls werden sie vom Servlet-Container ignoriert. Der DelegatingFilterProxy von Spring stellt die Verknüpfung zwischen web.xml und dem Anwendungskontext bereit .

2.1. Interne Arbeitsweise von DelegatingFilterProxy

Lassen Sie uns einen Blick darauf werfen, wie DelegatingFilterProxy die Kontrolle auf unsere Spring Bean überträgt.

Während der Initialisierung DelegatingFilterProxy holt die Filternamen und ruft die Bohne mit diesem Namen aus Spring Anwendungskontext. Diese Bean muss vom Typ javax.Servlet.Filter sein, dh ein „normaler“ Servlet-Filter. Eingehende Anfragen werden dann an diese Filter-Bean weitergeleitet.

Kurz gesagt, die doFilter () -Methode von DelegatingFilterProxy 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 in ApplicationInitializer 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 der Datei web.xml :

 applicationFilter org.springframework.web.filter.DelegatingFilterProxy 

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

2.2. Notwendigkeit für DelegatingFilterProxy

DelegatingFilterProxy ist eine Klasse im Webmodul von Spring. Es bietet Funktionen, mit denen HTTP-Aufrufe Filter durchlaufen können, bevor das tatsächliche Ziel erreicht wird. Mit Hilfe von DelegatingFilterProxy kann eine Klasse, die die Schnittstelle javax.Servlet.Filter implementiert, in die Filterkette eingebunden werden.

Spring Security verwendet beispielsweise DelegatingFilterProxy , um die Funktionen zur Abhängigkeitsinjektion und die Lebenszyklusschnittstellen von Spring für Sicherheitsfilter zu nutzen.

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

3. Erstellen eines benutzerdefinierten Filters

Wie oben beschrieben, DelegatingFilterProxy ist ein Servlet - Filter selbst die Delegierten zu einem bestimmten Feder Managed Bean das , dass Geräte Filter - Schnittstelle.

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

Beachten Sie, dass der Name der Spring-Bean mit dem Wert im Filternamen übereinstimmen muss, der bei der Registrierung des benutzerdefinierten Filters in der ApplicationInitializer- Klasse oder später in web.xml angegeben wurde, da die DelegatingFilterProxy- Klasse genau nach der Filter-Bean sucht gleicher Name im Anwendungskontext.

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 die Methode getServletFilters () von AbstractAnnotationConfigDispatcherServletInitializer ü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 über web.xml

Mal sehen, wie die Filterkonfiguration in web.xml aussieht:

 loggingFilter org.springframework.web.filter.DelegatingFilterProxy   loggingFilter /* 

Das Filterklassenargument ist vom Typ DelegatingFilterProxy und nicht die von uns erstellte Filterklasse. Wenn wir diesen Code ausführen und eine URL eingeben, wird die Methode doFilter () des CustomFilter ausgeführt und zeigt die Details der Anforderungsinformationen in der Protokolldatei an.

4. Fazit

In diesem Artikel haben wir beschrieben, wie DelegatingFilterProxy funktioniert und wie es verwendet wird.

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

Der Quellcode ist auf GitHub verfügbar.