Oversigt og behov for delegering af FilterProxy om foråret

1. Oversigt

Det DelegeringFilterProxy er et servletfilter, der gør det muligt at overføre kontrol til Filter klasser, der har adgang til Spring-applikationskonteksten. Spring Security er stærkt afhængig af denne teknik.

I denne vejledning dækker vi det detaljeret.

2. DelegeringFilterProxy

Javadoc til DelegeringFilterProxy siger, at det er en

Proxy til et standard Servlet-filter, der delegeres til en fjederstyret bønne, der implementerer filtergrænsefladen.

Når vi bruger servletfiltre, skal vi naturligvis erklære dem som en filterklasse i vores Java-config eller web.xmlEllers ignorerer servletbeholderen dem. Forårets DelegeringFilterProxy giver forbindelsen mellem web.xml og applikationens kontekst.

2.1. Intern bearbejdning af DelegeringFilterProxy

Lad os se på hvordan DelegeringFilterProxy overfører kontrol til vores Spring Bean.

Under initialisering DelegeringFilterProxy henter filternavn og henter bønnen med det navn fra Spring Application Context. Denne bønne skal være af typen javax.Servlet.Filter, dvs. et "normalt" servletfilter. Indgående anmodninger sendes derefter til denne filterbønne.

Kort sagt, DelegeringFilterProxydoFilter () metoden vil delegere alle opkald til en springbønne, så vi kan bruge alle Spring-funktioner i vores filterbønne.

Hvis vi bruger Java-baseret konfiguration, registreres vores filterregistrering ApplicationInitializer vil blive defineret som:

@ Override beskyttet javax.servlet.Filter [] getServletFilters () {DelegatingFilterProxy delegateFilterProxy = ny DelegatingFilterProxy (); delegateFilterProxy.setTargetBeanName ("applicationFilter"); returner nyt filter [] {delegateFilterProxy}; }

Hvis vi bruger XML, så i web.xml fil:

 applicationFilter org.springframework.web.filter.DelegatingFilterProxy 

Dette betyder, at enhver anmodning kan sendes til at passere gennem filteret defineret som Spring Bean med navnet applicationFilter.

2.2. Behov for DelegeringFilterProxy

DelegeringFilterProxy er en klasse i Spring's Web-modul. Det giver funktioner til at få HTTP-opkald til at passere gennem filtre, inden de når den faktiske destination. Med hjælp fra DelegeringFilterProxy, en klasse, der implementerer javax.Servlet.Filter interface kan tilsluttes filterkæden.

Som et eksempel gør Spring Security brug af DelegeringFilterProxy til, så det kan udnytte Spring's funktioner til afhængighedsinjektion og livscyklusgrænseflader til sikkerhedsfiltre.

DelegeringFilterProxy udnytter også påkald af specifikke eller flere filtre i henhold til Request URI-stier ved at give konfigurationen i Spring's applikationskontekst eller i web.xml.

3. Oprettelse af et brugerdefineret filter

Som beskrevet ovenfor, DelegeringFilterProxy er et servletfilter i sig selv, der delegerer til en bestemt Spring-managed bønne, der implementerer Filter Interface.

I de næste par sektioner opretter vi et brugerdefineret filter og konfigurerer det ved hjælp af Java & XML-baseret konfiguration.

3.1. Filterklasse

Vi opretter et simpelt filter, der logger anmodningsoplysninger, inden anmodningen fortsætter.

Lad os først oprette en brugerdefineret filterklasse:

@Component ("loggingFilter") offentlig klasse CustomFilter implementerer filter {privat statisk logger LOGGER = LoggerFactory.getLogger (CustomFilter.class); @Override public void init (FilterConfig config) kaster ServletException {// initialiserer noget} @Override public void doFilter (ServletRequest anmodning, ServletResponse svar, FilterChain chain) kaster IOException, ServletException {HttpServletRequest req = (HttpServletRequ; LOGGER.info ("Request Info:" + req); chain.doFilter (anmodning, svar); } @ Overstyr offentlig tomrum ødelægge () {// oprydningskode, hvis nødvendigt}} 

CustomFilter redskaber javax.Servlet.Filter. Denne klasse har en @Komponent kommentar for at registrere sig som Spring bean i applikationens sammenhæng. På denne måde DelegeringFilterProxy klasse kan finde vores filterklasse, mens filterkæden initialiseres.

Bemærk, at navnet på Spring Bean skal være det samme som værdien i filternavn leveres under registreringen af ​​det brugerdefinerede filter i ApplicationInitializer klasse eller i web.xml senere fordi DelegatingFilterProxy klasse vil kigge efter filterbønnen med det nøjagtige samme navn i applikationskonteksten.

Hvis den ikke kan finde en bønne med dette navn, hæver den en undtagelse ved opstart af applikationen.

3.2. Konfiguration af filteret via Java-konfiguration

For at registrere et brugerdefineret filter ved hjælp af Java-konfiguration skal vi tilsidesætte getServletFilters () metode til AbstractAnnotationConfigDispatcherServletInitializer:

offentlig klasse ApplicationInitializer udvider AbstractAnnotationConfigDispatcherServletInitializer {// nogle andre metoder her @Override beskyttet javax.servlet.Filter [] getServletFilters () {DelegatingFilterProxy delegateFilterProxy = ny DelegatingFilterProxy (); delegateFilterProxy.setTargetBeanName ("loggingFilter"); returner nyt filter [] {delegateFilterProxy}; }}

3.3. Konfiguration af filteret via web.xml

Lad os se, hvordan filterkonfigurationen i web.xml ligner:

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

Det filterklasse argumentet er af typen DelegeringFilterProxy og ikke den filterklasse, vi oprettede. Hvis vi kører denne kode og rammer en hvilken som helst URL, så doFilter () metode til CustomFilter vil blive udført og vise oplysninger om anmodningsinfo i logfilen.

4. Konklusion

I denne artikel har vi dækket hvordan DelegeringFilterProxy fungerer, og hvordan man bruger det.

Spring Security gør omfattende brug af DelegeringFilterProxy til sikring af web-API-opkald og ressourcer fra uautoriseret adgang.

Kildekoden er tilgængelig på GitHub.