![translation](https://cdn.durumis.com/common/trans.png)
Ez egy AI által fordított bejegyzés.
[Spring] Mi a Filter, Interceptor és Argument Resolver?
- Írás nyelve: Koreai
- •
-
Referencia ország: Minden ország
- •
- Informatika
Válasszon nyelvet
A durumis AI által összefoglalt szöveg
- A szűrő a J2EE szabványos specifikációja, amely a diszpécser szervletnek való átadás előtt/után további műveleteket végezhet az URL-mintákkal illeszkedő összes kéréshez. A webes konténerben fut, míg az interceptor egy Spring által biztosított technológia, amely lehetővé teszi a kérések és válaszok megtekintését vagy feldolgozását a diszpécser szervlet által a vezérlő hívások előtt és után. A Spring kontextusban működik.
- Az Argument Resolver egy olyan mechanizmus, amely indirekt módon segíthet a kívánt objektum létrehozásában a vezérlőbe érkező kérés bejövő értékeiből.
- A szűrők és interceperek között az a különbség, hogy a Spring konténerben vagy a webes konténerben futnak-e, valamint hogy a diszpécser szervlet vagy a vezérlő alapján dolgozzák fel a kéréseket. Az Argument Resolver az interceptor után fut és egy adott objektumot ad vissza.
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.
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.
- 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.
- 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ó
@WebFilter("/*")
public class dolphagoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
//Itt a előfeldolgozás
request.setCharacterEncoding("UTF-8");
System.out.println("doFilter() előtt....");
filterChain.doFilter(request, response);
//Itt a utófeldolgozás
System.out.println("doFilter() után....");
}
@Override
public void destroy() { }
Példa kód - @Component
@Order(1)
@Component
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() { }
- @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
@Configuration
public class CustomRegistrationBean {
@Bean
public FilterRegistrationBean customFilterBean() {
FilterRegistrationBean registration = new FilterRegistrationBean<>();
registration.setFilter(new CustomFilter());
registration.setOrder(1);
registration.addUrlPatterns("/api/*");
return registration;
}
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
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor());
registry.addInterceptor(new LoggingInterceptor());
}
- 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.
boolean supportsParameter(MethodParameter parameter);
@Nullable
- 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.
@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
- https://mangkyu.tistory.com/173
- https://junhyunny.github.io/spring-boot/filter-interceptor-and-aop/
- https://supawer0728.github.io/2018/04/04/spring-filter-interceptor/
- https://tecoble.techcourse.co.kr/post/2021-05-24-spring-interceptor/
- https://baeldung-cn.com/spring-mvc-handlerinterceptor-vs-filter
- https://www.baeldung.com/spring-boot-add-filter
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.