Pregled i potreba za delegiranjem filteraProxy u proljeće

1. Pregled

The DelegatingFilterProxy je filtar servleta koji omogućuje prosljeđivanje kontrole na filtar klase koje imaju pristup kontekstu aplikacije Spring. Spring Security se u velikoj mjeri oslanja na ovu tehniku.

U ovom ćemo ga priručniku detaljno pokriti.

2. DelegatingFilterProxy

Javadoc za DelegatingFilterProxy navodi da je to a

Proxy za standardni filtar Servlet, delegirajući grahu kojim upravlja Spring, koji implementira sučelje filtra.

Kada koristimo filtre servleta, očito ih moramo deklarirati kao klasa filtra u našoj Java-config ili web.xml, u suprotnom, spremnik servleta će ih ignorirati. Spring's DelegatingFilterProxy pruža vezu između web.xml i kontekst aplikacije.

2.1. Interni rad DelegatingFilterProxy

Pogledajmo kako DelegatingFilterProxy prenosi kontrolu na naš proljetni grah.

Tijekom inicijalizacije, DelegatingFilterProxy dohvaća naziv filtra i preuzima grah s tim imenom iz Spring Application Context. Ovaj grah mora biti tipa javax.Servlet.Filter, tj. "normalni" filtar servleta. Tada će se dolazni zahtjevi prosljeđivati ​​u ovaj grah filtra.

Ukratko, DelegatingFilterProxy'sdoFilter () metoda delegirat će sve pozive na grah Spring, omogućujući nam upotrebu svih značajki Springa u našem grahu filtra.

Ako koristimo konfiguraciju zasnovanu na Javi, naša registracija filtra u ApplicationInitializer bit će definirano kao:

@Override protected javax.servlet.Filter [] getServletFilters () {DelegatingFilterProxy delegateFilterProxy = novo DelegatingFilterProxy (); delegateFilterProxy.setTargetBeanName ("applicationFilter"); vrati novi filtar [] {delegateFilterProxy}; }

Ako koristimo XML, tada u web.xml datoteka:

 applicationFilter org.springframework.web.filter.DelegatingFilterProxy 

To znači da se može podnijeti bilo koji zahtjev za prolazak kroz filtar definiran kao Spring bean s imenom applicationFilter.

2.2. Potreba za DelegatingFilterProxy

DelegatingFilterProxy je predavanje u Springovom web modulu. Pruža značajke za prolazak HTTP poziva kroz filtre prije nego što stignu do stvarnog odredišta. Pomoću DelegatingFilterProxy, razred koji provodi javax.Servlet.Filter sučelje se može povezati u lanac filtra.

Kao primjer, Spring Security koristi DelegatingFilterProxy kako bi mogao iskoristiti značajke Springovih ubrizgavanja ovisnosti i sučelja životnog ciklusa za sigurnosne filtre.

DelegatingFilterProxy također koristi pozivanje specifičnih ili višestrukih filtara prema zahtjevima URI staza pružanjem konfiguracije u kontekstu Spring aplikacije ili u web.xml.

3. Izrada prilagođenog filtra

Kao što je gore opisano, DelegatingFilterProxy je sam filtar servleta koji delegira na određeni bean kojim upravlja Spring, koji implementira filtar Sučelje.

U sljedećih nekoliko odjeljaka stvorit ćemo prilagođeni filtar i konfigurirati ga pomoću konfiguracije temeljene na Javi i XML-u.

3.1. Klasa filtra

Stvorit ćemo jednostavan filtar koji bilježi podatke o zahtjevu prije nego što zahtjev nastavi.

Prvo napravimo klasu prilagođenog filtra:

@Component ("loggingFilter") javna klasa CustomFilter implementira Filter {private static Logger LOGGER = LoggerFactory.getLogger (CustomFilter.class); @Override javna void init (FilterConfig config) baca ServletException {// inicirati nešto} @Override public void doFilter (ServletRequest zahtjev, ServletResponse odgovor, FilterChain lanac) baca IOException, ServletException {HttpServletRequest req = HttpServletRequest req = HttpServletRequest req = HttpServletRequest req = HttpServletRequest req; LOGGER.info ("Zahtjev za informacije:" + zahtjev); chain.doFilter (zahtjev, odgovor); } @Override public void uništi () {// kod za čišćenje, ako je potrebno}} 

CustomFilter provodi javax.Servlet.Filter. Ovaj razred ima @Komponenta napomena za registraciju kao Spring bean u kontekstu aplikacije. Ovim putem, DelegatingFilterProxy klasa može pronaći našu klasu filtra tijekom inicijalizacije lanca filtra.

Imajte na umu da naziv proljetnog zrna mora biti jednak vrijednosti u naziv filtra osigurano tijekom registracije prilagođenog filtra u sustavu Windows ApplicationInitializer razred ili u web.xml kasnije jer DelegatingFilterProxy klasa će tražiti grah filtra s potpuno istim imenom u kontekstu aplikacije.

Ako ne može pronaći grah s ovim imenom, podignut će iznimku prilikom pokretanja aplikacije.

3.2. Konfiguriranje filtra putem Java konfiguracije

Da bismo registrirali prilagođeni filtar pomoću Java konfiguracije, moramo nadjačati getServletFilters () metoda AbstractAnnotationConfigDispatcherServletInitializer:

javna klasa ApplicationInitializer proširuje AbstractAnnotationConfigDispatcherServletInitializer {// neke druge metode ovdje @Override zaštićen javax.servlet.Filter [] getServletFilters () {DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy (); delegateFilterProxy.setTargetBeanName ("loggingFilter"); vrati novi Filter [] {delegateFilterProxy}; }}

3.3. Konfiguriranje filtra putem web.xml

Pogledajmo kako je konfiguracija filtra u web.xml izgleda kao:

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

The klasa filtra argument je tipa DelegatingFilterProxy a ne klasa filtra koju smo stvorili. Ako pokrenemo ovaj kôd i pritisnemo bilo koji URL, onda doFilter () metoda CustomFilter izvršit će se i prikazati detalje informacija o zahtjevu u datoteci dnevnika.

4. Zaključak

U ovom smo članku opisali kako DelegatingFilterProxy djela i kako ga koristiti.

Spring Security uvelike koristi DelegatingFilterProxy za zaštitu poziva i resursa web API-ja od neovlaštenog pristupa.

Izvorni kod dostupan je na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found