Overzicht en behoefte aan DelegatingFilterProxy in het voorjaar

1. Overzicht

De DelegatingFilterProxy is een servletfilter dat de controle doorlaat aan Filter klassen die toegang hebben tot de Spring-toepassingscontext. Spring Security vertrouwt sterk op deze techniek.

In deze tutorial zullen we het in detail behandelen.

2. DelegatingFilterProxy

De Javadoc voor DelegatingFilterProxy stelt dat het een

Proxy voor een standaard servletfilter, delegeren aan een door Spring beheerde bean die de filterinterface implementeert.

Bij het gebruik van servletfilters moeten we deze uiteraard declareren als een filterklasse in onze Java-config of web.xmlanders negeert de servlet-container ze. Lente DelegatingFilterProxy vormt de link tussen web.xml en de toepassingscontext.

2.1. Interne werking van DelegatingFilterProxy

Laten we eens kijken hoe DelegatingFilterProxy draagt ​​de controle over aan onze Spring bean.

Tijdens de initialisatie DelegatingFilterProxy haalt het filternaam en haalt de bean met die naam op uit Spring Application Context. Deze boon moet van het type zijn javax.Servlet.Filter, d.w.z. een "normaal" servletfilter. Inkomende verzoeken worden vervolgens doorgestuurd naar deze filterboon.

Kortom, DelegatingFilterProxy'sdoFilter () methode delegeert alle oproepen naar een Spring bean, waardoor we alle Spring-functies binnen onze filterboon kunnen gebruiken.

Als we een op Java gebaseerde configuratie gebruiken, is onze filterregistratie in ApplicationInitializer wordt gedefinieerd als:

@Override beschermd javax.servlet.Filter [] getServletFilters () {DelegatingFilterProxy delegateFilterProxy = nieuw DelegatingFilterProxy (); delegateFilterProxy.setTargetBeanName ("applicationFilter"); retourneer nieuw Filter [] {delegateFilterProxy}; }

Als we XML gebruiken, dan in de web.xml het dossier:

 applicationFilter org.springframework.web.filter.DelegatingFilterProxy 

Dit betekent dat elk verzoek kan worden gedaan om door het filter te gaan dat is gedefinieerd als Spring bean met de naam applicationFilter.

2.2. Behoefte aan DelegatingFilterProxy

DelegatingFilterProxy is een klasse in de webmodule van Spring. Het biedt functies om HTTP-oproepen door filters te laten gaan voordat de werkelijke bestemming wordt bereikt. Met de hulp van DelegerenFilterProxy, een klasse die het javax.Servlet.Filter interface kan in de filterketen worden aangesloten.

Als voorbeeld maakt Spring Security gebruik van DelegatingFilterProxy zodat het kan profiteren van Spring's afhankelijkheidsinjectiefuncties en levenscyclusinterfaces voor beveiligingsfilters.

DelegatingFilterProxy maakt ook gebruik van het aanroepen van specifieke of meerdere filters volgens Request URI-paden door de configuratie in de toepassingscontext van Spring of in web.xml.

3. Een aangepast filter maken

Zoals hierboven beschreven, DelegatingFilterProxy is zelf een servletfilter dat delegeert naar een specifieke door Spring beheerde bean die de Filter Koppel.

In de volgende secties maken we een aangepast filter en configureren we dit met behulp van op Java en XML gebaseerde configuratie.

3.1. Filterklasse

We gaan een eenvoudig filter maken dat logs vraagt ​​om informatie voordat het verzoek verder gaat.

Laten we eerst een aangepaste filterklasse maken:

@Component ("loggingFilter") openbare klasse CustomFilter implementeert Filter {privé statische Logger LOGGER = LoggerFactory.getLogger (CustomFilter.class); @Override public void init (FilterConfig-configuratie) gooit ServletException {// initialiseer iets} @Override public void doFilter (ServletRequest-verzoek, ServletResponse-antwoord, FilterChain-keten) gooit IOException, ServletException {HttpServletRequest req = (HttpServletRequest) -verzoek; LOGGER.info ("Verzoek om informatie:" + req); chain.doFilter (verzoek, antwoord); } @Override public void destroy () {// opschoningscode, indien nodig}} 

CustomFilter werktuigen javax.Servlet.Filter. Deze klas heeft een @Component annotatie om te registreren als Spring bean in de toepassingscontext. Op deze manier kan de DelegatingFilterProxy class kan onze filterklasse vinden tijdens het initialiseren van de filterketen.

Merk op dat de naam van de Spring bean dezelfde moet zijn als de waarde in de filternaam verstrekt tijdens de registratie van het aangepaste filter in ApplicationInitializer klas of in web.xml later omdat de DelegatingFilterProxy class zoekt naar de filterboon met exact dezelfde naam in de toepassingscontext.

Als het geen boon met deze naam kan vinden, wordt er een uitzondering gegenereerd bij het opstarten van de toepassing.

3.2. Het filter configureren via Java-configuratie

Om een ​​aangepast filter te registreren met behulp van Java-configuratie, moeten we het getServletFilters () methode van AbstractAnnotationConfigDispatcherServletInitializer:

openbare klasse ApplicationInitializer breidt AbstractAnnotationConfigDispatcherServletInitializer {// enkele andere methoden hier @Override beschermde javax.servlet.Filter [] getServletFilters () {DelegatingFilterProxy delegateFilterProxy = nieuw DelegatingFilterProxy (); delegateFilterProxy.setTargetBeanName ("loggingFilter"); retourneer nieuw Filter [] {delegateFilterProxy}; }}

3.3. Het filter configureren via web.xml

Laten we eens kijken hoe de filterconfiguratie in web.xml lijkt op:

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

De filterklasse argument is van het type DelegatingFilterProxy en niet de filterklasse die we hebben gemaakt. Als we deze code uitvoeren en op een URL klikken, dan doFilter () methode van de CustomFilter wordt uitgevoerd en toont de details van de verzoekinformatie in het logbestand.

4. Conclusie

In dit artikel hebben we besproken hoe DelegatingFilterProxy werkt en hoe je het moet gebruiken.

Spring Security maakt veel gebruik van DelegatingFilterProxy voor het beveiligen van de web-API-oproepen en bronnen tegen ongeautoriseerde toegang.

De broncode is beschikbaar op GitHub.