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.