A tavaszi modellparaméterek megváltoztatása Handler interceptorral

1. Bemutatkozás

Ebben az oktatóanyagban a tavaszi MVC-re fogunk koncentrálni HandlerInterceptor. Pontosabban, megváltoztatjuk a Spring MVC modell paramétereit egy kérés kezelése előtt és után.

Ha arról szeretne olvasni HandlerInterceptor alapokat, nézze meg ezt a cikket.

2. Maven-függőségek

Használata érdekében Elfogók, be kell foglalnia a következő szakaszt a függőségek szakasza pom.xml fájl:

 org.springframework spring-web 5.2.8.FELHASZNÁLÁS 

A legfrissebb verzió itt található.

Ez a függőség csak a tavaszi webet fedi le, ezért ne felejtsen el hozzáadni s-tpring-core és tavaszi kontextus egy teljes webes alkalmazáshoz és egy választott naplókönyvtárhoz.

3. Egyedi megvalósítás

Az egyik felhasználási esete HandlerInterceptor közös / felhasználóspecifikus paramétereket ad hozzá egy modellhez, amelyek minden generált nézetben elérhetők lesznek.

Példánkban egyedi elfogó megvalósítást fogunk használni, hogy hozzáadjuk a naplózott felhasználó felhasználónevét a modell paramétereihez. Bonyolultabb rendszerekben konkrétabb információkat is hozzáadhatunk, például: felhasználói avatar útvonal, felhasználói hely stb.

Kezdjük az újunk meghatározásával Elfogó osztály:

public class UserInterceptor kiterjeszti a HandlerInterceptorAdapter {private static Logger log = LoggerFactory.getLogger (UserInterceptor.class); ...}

Kiterjesztjük HandlerInterceptorAdapter, mivel csak megvalósítani szeretnénk preHandle () és postHandle () mód.

Mint korábban említettük, naplózott felhasználó nevét szeretnénk hozzáadni egy modellhez. Először ellenőriznünk kell, hogy a felhasználó be van-e jelentkezve. Ellenőrzéssel szerezhetjük ezeket az információkat SecurityContextHolder:

public static boolean isUserLogged () {try {return! SecurityContextHolder.getContext (). getAuthentication () .getName (). egyenlő ("anonymousUser"); } catch (e kivétel) {return false; }}

Amikor egy HttpSession létrehozva, de senki nincs bejelentkezve, a Spring Security kontextusban egy felhasználónév megegyezik a anonymousUser. Ezután folytatjuk a preHandle ():

3.1. Módszer preHandle ()

A kérelem kezelése előtt nem férünk hozzá a modell paramétereihez. A felhasználónév hozzáadásához használnunk kell HttpSession a paraméterek beállításához:

@Orride public boolean preHandle (HttpServletRequest kérés, HttpServletResponse válasz, Object objektum) dobja a Kivételt {if (isUserLogged ()) {addToModelUserDetails (request.getSession ()); } return true; }

Ez döntő fontosságú, ha ezen információk egy részét felhasználjuk a kérelem kezelése előtt. Amint látjuk, ellenőrizzük, hogy a felhasználó be van-e jelentkezve, majd a munkamenet megszerzésével paramétereket adunk a kérésünkhöz:

private void addToModelUserDetails (HttpSession munkamenet) {log.info ("================= addToModelUserDetails ======================= ==== "); Karakterlánc loggedUsername = SecurityContextHolder.getContext (). GetAuthentication (). GetName (); session.setAttribute ("felhasználónév", loggedUsername); log.info ("user (" + loggedUsername + ") munkamenet:" + session "; log.info ("=============== addToModelUserDetails ========================="); }

Használtuk SecurityContextHolder megszerezni loggedUsername. Lehet, hogy felülírja a Tavaszi Biztonságot UserDetails implementáció az e-mail megszerzéséhez a szokásos felhasználónév helyett.

3.2. Módszer postHandle ()

A kérelem kezelése után rendelkezésre állnak modellparamétereink, így hozzáférhetünk hozzájuk az értékek megváltoztatásához vagy újak hozzáadásához. Ennek érdekében a felülbíráltakat használjuk postHandle () módszer:

@Orride public void postHandle (HttpServletRequest req, HttpServletResponse res, Object o, ModelAndView model) dobja a Kivételt {if (model! = Null &&! IsRedirectView (model)) {if (isUserLogged ()) {addToModelUserDetails (model); }}}

Vessünk egy pillantást a megvalósítás részleteire.

Először is jobb ellenőrizni, hogy a modell nem az nulla. Megakadályozza, hogy a NullPointerException.

Sőt, ellenőrizhetjük, hogy a Kilátás nem az átirányítás példányaKilátás.

A kérelem kezelése, majd átirányítása után nincs szükség paraméterek hozzáadására / megváltoztatására, mivel azonnal, az új vezérlő újra végrehajtja a kezelést. A nézet átirányításának ellenőrzéséhez a következő módszert vezetjük be:

nyilvános statikus logikai isRedirectView (ModelAndView mv) {String viewName = mv.getViewName (); if (viewName.startsWith ("átirányítás: /"))) {return true; } Nézet nézet = mv.getView (); return (view! = null && view SmartView && ((SmartView) view példánya .isRedirectView ()); }

Végül újra ellenőrizzük, hogy van-e bejelentkezve egy felhasználó, és ha igen, paramétereket adunk a Spring modellhez:

private void addToModelUserDetails (ModelAndView model) {log.info ("================= addToModelUserDetails ======================= ==== "); Karakterlánc loggedUsername = SecurityContextHolder.getContext () .getAuthentication (). GetName (); model.addObject ("loggedUsername", loggedUsername); log.trace ("session:" + model.getModel ()); log.info ("=============== addToModelUserDetails ========================="); }

Felhívjuk figyelmét, hogy a naplózás nagyon fontos, mivel ez a logika alkalmazásunk „kulisszái mögött” működik. Könnyű elfelejteni, hogy mindegyiknél megváltoztatunk néhány modellparamétert Kilátás megfelelő naplózás nélkül.

4. Konfiguráció

Hozzáadni az újonnan létrehozott Elfogó a rugó konfigurációjába felül kell írnunk addInterceptors () módszer belül WebConfig osztály, amely megvalósítja WebMvcConfigurer:

@Orride public void addInterceptors (InterceptorRegistry registry) {register.addInterceptor (new UserInterceptor ()); }

Ugyanezt a konfigurációt érhetjük el az XML Spring konfigurációs fájlunk szerkesztésével:

Ettől a pillanattól kezdve hozzáférhetünk minden felhasználóhoz kapcsolódó paraméterhez az összes létrehozott nézeten.

Kérjük, vegye figyelembe, ha több tavasz Elfogók konfigurálva vannak, a preHandle () metódust a konfiguráció sorrendjében hajtjuk végre, míg postHandle () és afterCompletion () a módszereket fordított sorrendben hívják meg.

5. Következtetés

Ez az oktatóanyag a webes kérelmek elfogását mutatja be a Spring MVC HandlerInterceptor segítségével a felhasználói információk megadása érdekében.

Ebben a konkrét példában arra összpontosítottunk, hogy a webes alkalmazásunkban naplózott felhasználó adatait hozzáadjuk a modell paramétereihez. Ezt meghosszabbíthatja HandlerInterceptor részletesebb információk hozzáadásával.

Minden példa és konfiguráció itt érhető el a GitHub-on.

5.1. A sorozat cikkei

A sorozat összes cikke:

  • Bevezetés a tavaszi MVC Handler interceptorokba
  • A tavaszi modellparaméterek megváltoztatása Handler interceptorral (ez)