Zmena parametrov modelu pružiny s manipulátorom Interceptor

1. Úvod

V tomto tutoriáli sa zameriame na jarné MVC HandlerInterceptor. Presnejšie, zmeníme parametre modelu Spring MVC pred a po spracovaní žiadosti.

Ak si chcete prečítať o HandlerInterceptor základy, pozrite si tento článok.

2. Maven závislosti

Aby bolo možné použiť Interceptory, musíte zahrnúť nasledujúcu časť do a závislosti časť vašej pom.xml spis:

 org.springframework spring-web 5.2.8.RELEASE 

Najnovšiu verziu nájdete tu.

Táto závislosť sa vzťahuje iba na web Spring, takže nezabudnite pridať spring-core a jarný kontext pre úplnú webovú aplikáciu a protokolovú knižnicu podľa vášho výberu.

3. Vlastná implementácia

Jeden z prípadov použitia HandlerInterceptor pridáva spoločné / špecifické parametre používateľa do modelu, ktorý bude k dispozícii v každom vygenerovanom zobrazení.

V našom príklade použijeme vlastnú implementáciu zachytávača na pridanie používateľského mena prihláseného používateľa do parametrov modelu. V zložitejších systémoch môžeme pridať konkrétnejšie informácie ako: cesta k avatarovi používateľa, umiestnenie používateľa atď.

Začnime definovaním nášho nového Stíhačka trieda:

verejná trieda UserInterceptor rozširuje HandlerInterceptorAdapter {private static Logger log = LoggerFactory.getLogger (UserInterceptor.class); ...}

Predlžujeme HandlerInterceptorAdapter, ako to chceme iba implementovať preHandle () a postHandle () metódy.

Ako sme už spomínali, do modelu chceme pridať meno prihláseného používateľa. Najskôr je potrebné skontrolovať, či je používateľ prihlásený. Tieto informácie môžeme získať kontrolou SecurityContextHolder:

public static boolean isUserLogged () {try {return! SecurityContextHolder.getContext (). getAuthentication () .getName (). equals ("anonymousUser"); } catch (Výnimka e) {return false; }}

Keď sa HttpSession je založené, ale nikto nie je prihlásený, používateľské meno v kontexte Spring Security sa rovná anonymousUser. Ďalej pokračujeme v implementácii preHandle ():

3.1. Metóda preHandle ()

Pred spracovaním žiadosti nemôžeme získať prístup k parametrom modelu. Aby sme mohli pridať užívateľské meno, musíme použiť HttpSession nastavenie parametrov:

@Override public boolean preHandle (požiadavka HttpServletRequest, odpoveď HttpServletResponse, objekt Object) vyvolá výnimku {if (isUserLogged ()) {addToModelUserDetails (request.getSession ()); } návrat pravdivý; }

To je zásadné, ak niektoré z týchto informácií používame pred vybavením žiadosti. Ako vidíme, kontrolujeme, či je používateľ prihlásený, a potom pridaním parametrov k našej požiadavke získaním jeho relácie:

private void addToModelUserDetails (relácia HttpSession) {log.info ("=============== addToModelUserDetails ===================== ==== "); Reťazec logovanéUsername = SecurityContextHolder.getContext (). GetAuthentication (). GetName (); session.setAttribute ("meno používateľa", prihlásené meno používateľa); log.info ("používateľ (" + prihlásené používateľské meno + ") relácia:" + relácia); log.info ("================ addToModelUserDetails ========================="); }

Použili sme SecurityContextHolder získať loginUsername. Môžete prepísať jarnú bezpečnosť UserDetails implementácia na získanie e-mailu namiesto štandardného používateľského mena.

3.2. Metóda postHandle ()

Po spracovaní žiadosti sú k dispozícii naše parametre modelu, takže k nim môžeme pristupovať, aby sme zmenili hodnoty alebo pridali nové. Aby sme to dosiahli, používame prepísané postHandle () metóda:

@Override public void postHandle (HttpServletRequest req, HttpServletResponse res, Object o, ModelAndView model) vyvolá výnimku {if (model! = Null &&! IsRedirectView (model)) {if (isUserLogged ()) {addToModelUserDetails (model) }}}

Poďme sa pozrieť na podrobnosti implementácie.

Najskôr je lepšie skontrolovať, či model nie je nulový. Zabráni nám to v stretnutí s NullPointerException.

Ďalej môžeme skontrolovať, či a vyhliadka nie je inštanciou presmerovaniaVyhliadka.

Po spracovaní a následnom presmerovaní požiadavky nie je potrebné pridávať / meniť parametre, pretože nový radič okamžite vykoná spracovanie. Aby sme skontrolovali, či je zobrazenie presmerované, predstavujeme nasledujúcu metódu:

public static boolean isRedirectView (ModelAndView mv) {String viewName = mv.getViewName (); if (viewName.startsWith ("redirect: /")) {return true; } Zobraziť view = mv.getView (); return (view! = null && view instanceof SmartView && ((SmartView) view) .isRedirectView ()); }

Nakoniec znova skontrolujeme, či je používateľ prihlásený, a ak áno, pridávame parametre do modelu Spring:

private void addToModelUserDetails (ModelAndView model) {log.info ("=============== addToModelUserDetails ===================== ==== "); Reťazec logovanéUsername = SecurityContextHolder.getContext () .getAuthentication (). GetName (); model.addObject ("prihlásené používateľské meno", prihlásené používateľské meno); log.trace ("session:" + model.getModel ()); log.info ("================ addToModelUserDetails ========================="); }

Upozorňujeme, že protokolovanie je veľmi dôležité, pretože táto logika funguje „v zákulisí“ našej aplikácie. Je ľahké zabudnúť, že u každého meníme niektoré parametre modelu vyhliadka bez správneho prihlásenia.

4. Konfigurácia

Ak chcete pridať náš novo vytvorený Stíhačka do jarnej konfigurácie, musíme prepísať addInterceptors () metóda vo vnútri WebConfig triedy, ktorá implementuje WebMvcConfigurer:

@Override public void addInterceptors (register InterceptorRegistry) {registry.addInterceptor (nový UserInterceptor ()); }

Rovnakú konfiguráciu môžeme dosiahnuť úpravou nášho konfiguračného súboru XML Spring:

Od tejto chvíle môžeme pristupovať ku všetkým parametrom súvisiacim s používateľom vo všetkých vygenerovaných zobrazeniach.

Upozorňujeme, že ak je jar viac Interceptory sú nakonfigurované, preHandle () metóda sa vykonáva v poradí konfigurácie, zatiaľ čo postHandle () a po dokončení () metódy sú vyvolané v opačnom poradí.

5. Záver

Tento tutoriál predstavuje zachytávanie webových požiadaviek pomocou HandlerInterceptor Spring MVC s cieľom poskytnúť informácie o používateľovi.

V tomto konkrétnom príklade sme sa zamerali na pridanie podrobností prihláseného používateľa v našej webovej aplikácii do parametrov modelu. Môžete to predĺžiť HandlerInterceptor implementácia pridaním podrobnejších informácií.

Všetky príklady a konfigurácie sú k dispozícii tu na GitHub.

5.1. Články v seriáli

Všetky články zo série:

  • Úvod do zachytávačov jarných MVC manipulátorov
  • Zmena parametrov modelu pružiny pomocou manipulátora Interceptor (tento)

$config[zx-auto] not found$config[zx-overlay] not found