제이온

[Spring] Mi a Filter, Interceptor és Argument Resolver?

  • Írás nyelve: Koreai
  • Országkód: Minden országcountry-flag
  • Informatika

Létrehozva: 2024-04-27

Létrehozva: 2024-04-27 00:41

Mi a szűrő (Filter)?

A szűrő a J2EE szabványos specifikáció része, amely lehetővé teszi, hogy kiegészítő műveleteket hajtson végre minden olyan kérésre, amely megfelel egy URL-mintának, mielőtt azok eljutnának a Dispatcher Servlethez. Más szóval, a Spring konténer helyett a Tomcathez hasonló webes konténer kezeli őket, így a kérelmek a Dispatcher Servlethez való eljutás előtt feldolgozódnak.


[Spring] Mi a Filter, Interceptor és Argument Resolver?


Szűrő (Filter) implementáció

A szűrők hozzáadásához a javax.servlet Filter interfészt kell implementálni, amely a következő három módszert tartalmazza.


  • init metódus
    • Ez a metódus inicializálja a szűrő objektumot és hozzáadja a szolgáltatáshoz. A webes konténer egyszer hívja az init metódust a szűrő objektum inicializálásához. Ezt követően a kérelmeket a doFilter() metóduson keresztül dolgozzák fel.
  • doFilter metódus
    • Ez a metódus a webes konténer által futtatódik, mielőtt a megfelelő URL-mintához tartozó HTTP kérelmek eljutnának a Dispatcher Servlethez, és mielőtt a Dispatcher Servlet HTTP válaszokat küldene a kliensnek.
      A doFilter() paraméterként a FilterChain-t tartalmazza. A FilterChain doFilter() metódusával tovább lehet küldeni a kérelmeket a következő célpontra. A chain.doFilter() metódus meghívása előtt és után elhelyezhetjük a szükséges feldolgozási lépéseket a kívánt műveletek végrehajtásához.
  • destory metódus
    • Ez a metódus eltávolítja a szűrő objektumot a szolgáltatásból és visszaadja a használt erőforrásokat. A webes konténer egyszer hívja ezt a metódust, és a doFilter() metóduson keresztül további feldolgozás nem lesz.


Példa kód - Servlet specifikáció

```javascript @WebFilter("/*") public class dolphagoFilter implements Filter {

FilterChain filterChain) throws IOException, ServletException { //Itt a előfeldolgozás request.setCharacterEncoding("UTF-8"); System.out.println("doFilter() előtt....");

}


Példa kód - @Component

```javascript @Order(1) @Component public class CustomFilter implements Filter {

}


  • @Component: A szűrő regisztrálható Spring Bean-ként.
  • @Order: Ha több szűrő van, akkor lehetőség van a sorrendjük beállítására.
  • Ha a szűrő regisztrálva van Spring Bean-ként, akkor a Spring specifikációhoz tartozó más Bean-eket is használhatja.


Példa kód - @Configuration

```javascript @Configuration public class CustomRegistrationBean {

}

Ha egy szűrőt csak bizonyos URI-kra szeretnénk alkalmazni, akkor a FilterRegistrationBean osztályt használva regisztrálhatjuk Spring Bean-ként.


Szűrő (Filter) felhasználási terület

Főként a kérelmek paraméterének ellenőrzésére és feldolgozására szolgálnak.


  • Biztonsági kapcsolódó közös műveletek
    • A szűrők a webes konténerben futnak, így a biztonsági ellenőrzéseket (pl. XSS, CSRF védelem) végrehajthatják, és blokkolhatják a hibás kérelmeket. Így a kérelmek a Spring konténerbe nem jutnak el, ami növeli az alkalmazás biztonságát.
  • Naplózás minden kéréshez
  • Kép/adat tömörítés és karakterlánc kódolás
    • A szűrők implementálhatnak olyan általános funkciókat, mint a képek vagy adatok tömörítése vagy a karakterlánc kódolás, amelyeket a webes alkalmazás egészében használnak.
  • ServletRequest testreszabása
    • A HttpServletRequest objektum csak egyszer tudja beolvasni a Body tartalmát. Ezért a szűrők vagy az intercepteők nem tudják beolvasni a Body-t. A Body naplózásához testreszabott ServletRequest objektumot hozhatunk létre.


Interceptor (Interceptor)

Mi az Interceptor (Interceptor)?

Az Interceptor (Interceptor) a J2EE szabványos specifikációjától eltérően a Spring által biztosított technológia, amely lehetővé teszi a kérelmek és válaszok hivatkozását vagy feldolgozását a Dispatcher Servlet által a kontroller meghívása előtt és után. Más szóval, a webes konténerben futó szűrőkkel ellentétben az intercepteők a Spring kontextusban futnak.


A Dispatcher Servlet a megfelelő kontroller megtalálásához kérelmet küld a Handler Mappingnek, amely válaszként egy végrehajtási láncot (HandlerExecutionChain) ad vissza. Ha az végrehajtási láncban több interceptor van regisztrálva, akkor sorrendben futnak, mielőtt a kontroller végrehajtódik. Ha nincs interceptor, akkor közvetlenül a kontroller fut.


Interceptor (Interceptor) implementáció

Az intercepteők hozzáadásához az org.springframework.web.servlet.HandlerInterceptor interfészt kell implementálni, amely a következő három módszert tartalmazza.


  • preHandle metódus
    • A preHandle metódus a kontroller meghívása előtt fut. Ez a metódus használható előfeldolgozási műveletekhez, a kérelem adatainak feldolgozásához vagy hozzáadásához.
    • A preHandle metódus harmadik paramétere, a handler paraméter egy olyan absztrakt objektum, amely a @RequestMapping annotációval ellátott metódus adatait tartalmazza.
    • A preHandle metódus visszatérési típusa boolean. Ha a visszatérési érték true, akkor a feldolgozás a következő lépésre megy, de ha false, akkor a feldolgozás leáll, és a további műveletek (a következő interceptor vagy a kontroller) nem lesznek végrehajtva.
  • postHandle metódus
    • A postHandle metódus a kontroller meghívása után fut. Ez a metódus használható utófeldolgozási műveletekhez.
  • afterCompletion metódus
    • Az afterCompletion metódus, ahogy a neve is sugallja, a végső eredmény létrehozása után, beleértve a nézetek létrehozását is, fut.


Példa kód

```javascript @Component public class CustomInterceptor implements HandlerInterceptor {

}

@Configuration public class WebMvcConfiguration implements WebMvcConfigurer {

}


  • A létrehozott interceptor regisztrálása Bean-ként.
  • A létrehozott interceptor regisztrálása a WebMvcConfigurer interfész addInterceptors() metódusában.
  • Az intercepteők az InterceptorRegistry-ben való regisztrálásuk sorrendjében futnak.


Interceptor (Interceptor) felhasználási terület

Főként a szolgáltatás logika felhasználásával a kérelmek adatainak konzisztenciáját kezelik.


  • Hitelesítés/engedélyezéshez kapcsolódó közös műveletek
    • Az intercepteők a kontrollerbe való belépés előtt végrehajthatnak olyan ellenőrzéseket, mint a hitelesítés vagy az engedélyezés, amelyek a kliens kéréseihez kapcsolódnak.
  • API hívások naplózása
    • A kapott HttpServletRequest és HttpServletResponse objektumok segítségével rögzíthetjük a kliens információkat.
  • Adatfeldolgozás a Controller-be való átadás előtt
    • A kapott HttpServletRequest és HttpServletResponse objektumok feldolgozásával átadhatjuk az adatokat a controllernek.
  • AOP utánzás
    • A preHandle() metódus harmadik paramétere, a HandlerMethod objektum révén megtudhatjuk a végrehajtandó metódus szignatúráját és egyéb információkat, amelyeket felhasználhatunk a logika végrehajtásának döntéséhez.


Szűrő (Filter) vs Interceptor (Interceptor)

  • A szűrők a webes kontextusban futnak, az intercepteők pedig a Spring kontextusban, így a végrehajtási időpontjuk eltérő.
  • A szűrők a Dispatcher Servlet végrehajtása előtt és után is dolgozhatnak, míg az intercepteők a kontroller végrehajtása előtt és után is.
  • A szűrők használata akkor ajánlott, ha olyan feladatokat kell végrehajtani, amelyek függetlenek a Springtől, globálisan kell feldolgozni a kérelmeket, ellenőrizni kell a kérelmek paraméterit vagy használni kell a ServletRequest objektumot a HttpServletRequest helyett.
  • Az intercepteők akkor ajánlottak, ha globálisan kell feldolgozni a Spring által kapott kliens kérelmekkel kapcsolatos feladatokat, vagy ha be kell vonni a szolgáltatás logikát.
  • Az intercepteők a @ControllerAdvice és @ExceptionHandler annotációk használatával tudnak kivételeket kezelni, a szűrők azonban nem tudnak ezt megtenni.
    • A szűrők általában try~catch blokkal veszik körül a doFilter() metódust, és közvetlenül kezelik a kivételeket.


Argument Resolver

Mi az Argument Resolver?

Az Argument Resolver közvetett módon képes létrehozni a kívánt objektumokat a kontrollernek küldött kérelmek adataiból.


Argument Resolver felhasználási terület

Például képzeljük el, hogy egy JWT tokennel érkezik egy kérés. A token érvényességének ellenőrzése és a tokenben tárolt azonosító kinyerése után szükség van egy bejelentkezett felhasználói objektum létrehozására.

Argument Resolver nélkül minden kontrollernek implementálnia kellene a token érvényességének ellenőrzését és a bejelentkezett felhasználói objektum létrehozását. Ez redundáns kódot eredményezne a felhasználó-ellenőrzést igénylő controllerekben, és növelné a controllerek felelősségét. Az Argument Resolver segít megoldani ezt a problémát.


Argument Resolver implementáció

Az Argument Resolver a HandlerMethodArgumentResolver interfész implementálásával használható. Ez az interfész megköveteli a következő két metódus implementálását.


```javascript boolean supportsParameter(MethodParameter parameter);

@Nullable Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;


  • supportsParameter metódus
    • Készítsünk egy annotációt, amelyet a kívánt paraméterek elé lehet helyezni, hogy az Argument Resolver futtatódjon. A supportsParameter() metódus ellenőrzi, hogy a kapott metódus paraméterében szerepel-e a kívánt annotáció, és ha igen, akkor true értéket ad vissza.
  • resolveArgument metódus
    • Ha a supportsParameter() metódus true értéket adott vissza (azaz a kívánt annotációval ellátott paraméter van), akkor ez a metódus felelős a paraméter adatainak megfelelő formátumba való átalakításáért és a visszatérésért.


Az Argument Resolver használata esetén a kontroller implementációja a következő lesz.


```javascript @GetMapping("/me") public ResponseEntity findMemberOfMine(@AuthenticationPrincipal LoginMember loginMember) { MemberResponse memberResponse = memberService.findMember(loginMember.getId()); return ResponseEntity.ok().body(memberResponse); }


Argument Resolver és Interceptor (Interceptor) különbségek

  • Az Argument Resolver az interceptor után fut, és egy olyan objektumot ad vissza, amelyet a kontrollernek küldött kérelem adataiból hozott létre.
  • Az interceptor viszont a kontroller végrehajtása előtt lefoglalja a kérelmet, és nem tud objektumot visszaadni. Csak boolean vagy void visszatérési típusok lehetségesek.


Forrás


Várható interjúkérdések és válaszok

Mi a szűrő?

A szűrők olyan mechanizmusok, amelyek lehetővé teszik a kiegészítő műveletek végrehajtását minden olyan kérésre, amely megfelel egy URL-mintának, mielőtt azok eljutnának a Dispatcher Servlethez. A szűrők a servlet konténerben futnak.


Mikor kell szűrőt használni?

A szűrők akkor használhatók, ha olyan feladatokat kell végrehajtani, amelyek függetlenek a Springtől, globálisan kell feldolgozni a kérelmeket, vagy ellenőrizni kell a kérelmek paraméterit.

Tipikus példa a biztonsági kapcsolódó közös műveletek, a naplózás minden kéréshez, a kép/adat tömörítés és karakterlánc kódolás, valamint a ServletRequest testreszabása.


Mi az interceptor?

Az intercepteők a Dispatcher Servlet által a kontroller meghívása előtt és után lehetővé teszik a kérelmek és válaszok hivatkozását vagy feldolgozását. Az intercepteők a Spring konténerben futnak.


Mikor kell interceptort használni?

Az intercepteők akkor használhatók, ha globálisan kell feldolgozni a Spring által kapott kliens kérelmekkel kapcsolatos feladatokat, vagy ha be kell vonni a szolgáltatás logikát.

Tipikus példa a hitelesítés/engedélyezéshez kapcsolódó közös műveletek, az API hívások naplózása, a Controller-be való átadás előtti adatfeldolgozás.


Milyen különbség van a szűrő és az interceptor között?

A szűrők a servlet konténerben futnak, míg az intercepteők a Spring konténerben.

A szűrők a Dispatcher Servlet végrehajtása előtt és után is dolgozhatnak, míg az intercepteők a kontroller végrehajtása előtt és után is.

Ezért a szűrők akkor ajánlottak, ha olyan feladatokat kell végrehajtani, amelyek függetlenek a Springtől, míg az intercepteők akkor ajánlottak, ha globálisan kell feldolgozni a Spring által kapott kliens kérelmekkel kapcsolatos feladatokat.


Mi az Argument Resolver?

Az Argument Resolver olyan mechanizmus, amely a kontrollernek küldött kérelmek adataiból hoz létre objektumokat.


Mikor kell Argument Resolvert használni?

Az Argument Resolver akkor használható, ha egy JWT tokennel érkezik egy kérés, és a token érvényességének ellenőrzése után a tokenben tárolt azonosítóból létre kell hozni egy bejelentkezett felhasználói objektumot.


Mi a különbség az interceptor és az Argument Resolver között?

Az Argument Resolver a kontrollernek küldött kérelem adataiból hoz létre objektumokat, míg az interceptor nem tud objektumot visszaadni. Az interceptor az Argument Resolver előtt fut.

Hozzászólások0