Ich sehe dies in meinen Spring MVC-Apps web.xml
:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
Ich versuche herauszufinden, warum es da ist und ob es tatsächlich gebraucht wird.
Ich habe diese Erklärung in den Spring-Dokumenten gefunden, aber es hilft mir nicht, sie zu verstehen:
Es scheint darauf hinzudeuten, dass diese Komponente der "Klebstoff" zwischen den in definierten Servlets web.xml
und den in der Feder definierten Komponenten ist applicationContext.xml
.
7.1 DelegatingFilterProxy
Wenn Sie Servlet-Filter verwenden, müssen Sie diese natürlich in Ihrem deklarieren
web.xml
, sonst werden sie vom Servlet-Container ignoriert. In Spring Security sind die Filterklassen auch Spring Beans, die im Anwendungskontext definiert sind und somit die umfangreichen Funktionen zur Abhängigkeitsinjektion und die Lebenszyklusschnittstellen von Spring nutzen können. Spring'sDelegatingFilterProxy
stellt die Verbindung zwischenweb.xml
und dem Anwendungskontext her.Wenn Sie DelegatingFilterProxy verwenden, wird in der
web.xml
Datei Folgendes angezeigt:<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Beachten Sie, dass der Filter tatsächlich eine
DelegatingFilterProxy
ist und nicht die Klasse, die die Logik des Filters tatsächlich implementiert. SieDelegatingFilterProxy
delegieren die Methoden des Filters an eine Bean, die aus dem Spring-Anwendungskontext abgerufen wird. Auf diese Weise kann die Bean von der Unterstützung des Lebenszyklus des Spring-Webanwendungskontexts und der Flexibilität bei der Konfiguration profitieren. Die Bean muss implementiert seinjavax.servlet.Filter
und denselben Namen wie das Element filter-name haben. Weitere Informationen finden Sie im Javadoc for DelegatingFilterProxy
Also, wenn ich das aus meinem herausnehme web.xml
, was wird passieren? Meine Servlets können nicht mit dem Spring-Container kommunizieren? **
quelle
Wissen Sie, was ein Servlet-Filter ist und wie er funktioniert? Es ist ein sehr nützlicher Teil der Servlet-Spezifikation, mit dem wir AOP-ähnliche Konzepte auf die Bearbeitung von HTTP-Anforderungen anwenden können. Viele Frameworks verwenden Filterimplementierungen für verschiedene Zwecke, und es ist nicht ungewöhnlich, benutzerdefinierte Implementierungen davon zu finden, da sie sehr einfach zu schreiben und nützlich sind. In einer Spring-App ist das meiste, was Ihre App tun kann, in Ihren Spring Beans. Eine Filterinstanz wird jedoch vom Servlet-Container gesteuert. Der Container instanziiert, initialisiert und zerstört ihn. Die Servlet-Spezifikation erfordert jedoch keine Spring-Integration, sodass Sie ein wirklich nützliches Konzept (Filter) haben, das Sie nicht bequem an Ihre Spring-App und die Beans binden können, die die Arbeit erledigen.
Geben Sie den DelegatingFilterProxy ein. Sie schreiben eine Filter-Implementierung und machen sie zu einer Spring-Bean. Anstatt der web.xml eine eigene Filter-Klasse hinzuzufügen, verwenden Sie DelegatingFilterProxy und geben ihr im Spring-Kontext den Bean-Namen Ihres Filters. (Wenn Sie keinen expliziten Namen angeben, wird der "Filtername" verwendet.) Zur Laufzeit übernimmt DelegatingFilterProxy dann die Komplexität, die tatsächliche Implementierung - die in Spring geschriebene und konfigurierte - zu finden und Anforderungen an diese weiterzuleiten . Zur Laufzeit ist es so, als hätten Sie Ihren Filter in der Datei web.xml aufgelistet, aber Sie haben den Vorteil, dass Sie ihn wie jede andere Spring Bean verkabeln können.
Wenn Sie diese Filterzuordnung aus Ihrer web.xml entfernen, funktioniert alles weiter, aber keine Ihrer URLs wird gesichert. (Vorausgesetzt, der Name "springSecurityFilterChain" beschreibt genau, was er tut.) Dies liegt daran, dass diese Zuordnung jede eingehende Anforderung filtert und an einen Sicherheitsfilter weitergibt, der in Ihrem Spring-Kontext definiert ist.
quelle
Was sind Servlet-Filter?
Servlet-Filter sind im Allgemeinen ein Java WebApp-Konzept. Sie können Servlet-Filter in jeder Webanwendung verwenden, unabhängig davon, ob Sie Spring Framework in Ihrer Anwendung verwenden oder nicht.
Diese Filter können Anforderungen abfangen, bevor sie das Zielservlet erreichen. Sie können allgemeine Funktionen wie die Autorisierung in Servlet-Filtern implementieren. Nach der Implementierung können Sie den Filter in Ihrer web.xml so konfigurieren, dass er auf ein bestimmtes Servlet, bestimmte Anforderungs-URL-Muster oder alle URL-Muster angewendet wird.
Wo werden Servlet-Filter eingesetzt?
Moderne Web-Apps können Dutzende solcher Filter haben. Dinge wie Autorisierung, Caching, ORM-Sitzungsverwaltung und Abhängigkeitsinjektion werden häufig mit Hilfe eines Servlet-Filters implementiert. Alle diese Filter müssen registriert sein
web.xml
.Instantiieren von Servlet-Filtern - ohne Spring Framework
Ihr Servlet-Container erstellt Instanzen von Filtern, die in deklariert sind,
web.xml
und ruft sie zu geeigneten Zeiten auf (dh wenn Servlet-Anforderungen bearbeitet werden). Wenn Sie wie die meisten DI-Fans (Dependency Injection) sind, würden Sie wahrscheinlich sagen, dass das Erstellen von Instanzen das ist, was mein DI-Framework (Spring) besser kann. Kann ich meine Servlet-Filter nicht mit Spring erstellen lassen, damit sie für alle DI-Vorteile geeignet sind?DelegatingFilterProxy
, damit Spring Ihre Filterinstanzen erstelltHier
DelegatingFilterProxy
tritt ein. Dies istDelegatingFilterProxy
eine Verbesserung derjavax.servlet.Filter
von Spring Framework bereitgestellten Schnittstelle. Sobald SieDelegatingFilterProxy
in web.xml konfiguriert haben , können Sie die tatsächlichen Beans deklarieren , die die Filterung in Ihrer Spring-Konfiguration durchführen. Auf diese Weise erstellt Spring die Instanzen von Beans, die die eigentliche Filterung durchführen, und Sie können DI verwenden, um diese Beans zu konfigurieren.Beachten Sie, dass Sie nur eine einzige
DelegatingFilterProxy
Deklaration in benötigen,web.xml
aber mehrere Filterbean
in Ihrem Anwendungskontext miteinander verkettet haben können .quelle
Die Sache ist, Servlet-Filter werden vom Servlet-Container und nicht von der Feder verwaltet. Möglicherweise müssen Sie einige Federkomponenten in Ihre Filter einspritzen.
Also, wenn Sie etwas brauchen wie:
Dann benötigen Sie den delegierenden Filter-Proxy.
quelle
Sie haben Recht mit "Kleber" Zeug. Wie in JavaDocs von FilterChainProxy geschrieben :
Eine ausgezeichnete Erklärung finden Sie im Abschnitt FIlterChainProxy des Blogs Behind the Spring Security Namespace .
quelle
"SpringSecurityFilterChain" in web.xml hat mich verwirrt und diese Antwort im springframework-Sicherheitsdokument gefunden:
Hier ist der Link http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html
quelle
Es ist lange her, aber ich hatte die gleiche Frage und fand diese: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html
Ich habe versucht, mein Frühjahrssicherheitsprojekt auszuführen, indem ich den betreffenden Filter entfernt und auch hinzugefügt habe. Was ich gefunden habe, ist, wenn wir den Filter hinzufügen, nur dann wird der Anruf zur erforderlichen Anmeldeseite umgeleitet, wie in der Spring-Security-Konfiguration definiert.
Daher stimme ich der Antwort von @ Ryan zu.
quelle