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)