Á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.