Áttekintés és szükség a DelegatingFilterProxy tavasszal

1. Áttekintés

A DelegatingFilterProxy egy servlet szűrő, amely lehetővé teszi a vezérlés átadását a Szűrő osztályok, amelyek hozzáférnek a tavaszi alkalmazáskörnyezethez. A Spring Security nagyban támaszkodik erre a technikára.

Ebben az oktatóanyagban részletesen bemutatjuk.

2. DelegatingFilterProxy

A Javadoc for DelegatingFilterProxy kijelenti, hogy ez a

Proxy egy standard Servlet szűrőhöz, egy Spring által kezelt babra delegálva, amely megvalósítja a Filter interfészt.

A servlet szűrők használatakor nyilvánvalóan a-ként kell deklarálnunk őket filter-osztály a Java-config vagy web.xml, ellenkező esetben a servlet tároló figyelmen kívül hagyja őket. Tavaszi DelegatingFilterProxy biztosítja a kapcsolatot web.xml és az alkalmazás összefüggéseit.

2.1. A belső munka DelegatingFilterProxy

Nézzük meg, hogyan DelegatingFilterProxy átadja az irányítást a tavaszi babunknak.

Az inicializálás során DelegatingFilterProxy elhozza a szűrő-név és lekéri az ilyen nevű babot a Spring Application Context-ből. Ennek a babnak típusúnak kell lennie javax.Servlet.Filter, azaz „normál” servlet szűrő. A beérkező kéréseket ezután továbbítjuk ennek a szűrőparancsnak.

Röviden, DelegatingFilterProxy'sdoFilter () A metódus minden hívást egy tavaszi babra delegál, lehetővé téve számunkra, hogy a szűrő babunk összes tavaszi funkcióját felhasználjuk.

Ha Java-alapú konfigurációt használunk, akkor a szűrőnk regisztrációja ApplicationInitializer fogják meghatározni:

@Orride védett javax.servlet.Filter [] getServletFilters () {DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy (); delegateFilterProxy.setTargetBeanName ("applicationFilter"); return new Filter [] {delegateFilterProxy}; }

Ha XML-t használunk, akkor a web.xml fájl:

 applicationFilter org.springframework.web.filter.DelegatingFilterProxy 

Ez azt jelenti, hogy bármilyen kérés megadható a tavaszi bab néven definiált szűrőn keresztül applicationFilter.

2.2. Szükség valamire DelegatingFilterProxy

DelegatingFilterProxy osztály a Spring Web moduljában. Olyan funkciókat kínál, amelyek segítségével a HTTP-hívások áthaladnak a szűrőkön, mielőtt elérnék a tényleges célt. Segítségével DelegatingFilterProxy, osztály megvalósítója javax.Servlet.Szűrő interfész beköthető a szűrőláncba.

Példaként a Spring Security használja DelegatingFilterProxy így kihasználhatja a Spring függőségbefecskendezési szolgáltatásainak és a biztonsági szűrők életciklus-interfészeinek előnyeit.

DelegatingFilterProxy emellett kihasználja a specifikus vagy több szűrő meghívását a Request URI elérési útjai szerint azáltal, hogy a konfigurációt Spring alkalmazáskörnyezetében vagy a web.xml.

3. Egyéni szűrő létrehozása

A fent leírtak szerint, DelegatingFilterProxy maga a servlet szűrő, amely egy adott Spring által kezelt babot delegál, amely megvalósítja a Szűrő Felület.

A következő szakaszokban létrehozunk egy egyéni szűrőt, és azt Java és XML alapú konfigurációval konfiguráljuk.

3.1. Szűrő osztály

Létrehozunk egy egyszerű szűrőt, amely naplózza a kérési információkat, mielőtt a kérés tovább haladna.

Először hozzunk létre egy egyéni szűrőosztályt:

@Component ("loggingFilter") public class CustomFilter implementálja a Filter {private static Logger LOGGER = LoggerFactory.getLogger (CustomFilter.class); A @Orride public void init (FilterConfig config) ServletException-t dobja {// valami inicializálása} @Orride public void doFilter (ServletRequest kérés, ServletResponse válasz, FilterChain lánc) IOException, ServletException {HttpServletRequest reqlet = (Http); LOGGER.info ("Információ kérése:" + igény); chain.doFilter (kérés, válasz); } @Orride public void destr (() {// tisztító kód, ha szükséges}} 

CustomFilter megvalósítja javax.Servlet.Szűrő. Ennek az osztálynak van egy @Összetevő annotáció, hogy regisztráljon tavaszi babként az alkalmazás kontextusában. Így a DelegatingFilterProxy osztály megtalálja a szűrő osztályunkat, miközben inicializálja a szűrő láncot.

Vegye figyelembe, hogy a tavaszi bab nevének meg kell egyeznie a szűrő-név Az egyéni szűrő regisztrációja során biztosított ApplicationInitializer osztályban vagy ben web.xml később mivel a DelegatingFilterProxy osztály az alkalmazáskörnyezetben pontosan ugyanazzal a névvel keresi a szűrőbabot.

Ha nem talál ilyen nevű babot, kivételt hoz az alkalmazás indításakor.

3.2. A szűrő konfigurálása a Java konfigurációval

Egy egyéni szűrő Java konfigurációval történő regisztrálásához felül kell írnunk a getServletFilters () a metódusa AbstractAnnotationConfigDispatcherServletInitializer:

public class ApplicationInitializer kiterjeszti az AbstractAnnotationConfigDispatcherServletInitializer {// néhány más módszert itt @Orride védett javax.servlet.Filter [] getServletFilters () {DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy (); delegateFilterProxy.setTargetBeanName ("loggingFilter"); return new Filter [] {delegateFilterProxy}; }}

3.3. A szűrő konfigurálása a következővel: web.xml

Lássuk, hogyan működik a szűrő konfigurációja web.xml úgy néz ki, mint a:

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

A filter-osztály argumentum típusú DelegatingFilterProxy és nem az általunk létrehozott szűrőosztály. Ha ezt a kódot futtatjuk, és bármely URL-t eltalálunk, doFilter () módszere CustomFilter végrehajtásra kerül, és megjeleníti a kérelem információit a naplófájlban.

4. Következtetés

Ebben a cikkben bemutattuk, hogyan DelegatingFilterProxy működik és hogyan kell használni.

A Spring Security széles körben használja DelegatingFilterProxy a webes API-hívások és erőforrások jogosulatlan hozzáféréstől való védelméhez.

A forráskód elérhető a GitHubon.