Ændring af fjedermodelparametre med Handler Interceptor

1. Introduktion

I denne vejledning vil vi fokusere på Spring MVC HandlerInterceptor. Mere specifikt vil vi ændre Spring MVCs modelparametre før og efter håndtering af en anmodning.

Hvis du vil læse om Handler Interceptor's grundlæggende, tjek denne artikel.

2. Maven-afhængigheder

For at bruge Opfangere, skal du medtage følgende afsnit i a afhængigheder sektion af din pom.xml fil:

 org.springframework spring-web 5.2.8.RELEASE 

Seneste version kan findes her.

Denne afhængighed dækker kun Spring Web, så glem ikke at tilføje spring-core og forårskontekst til en komplet webapplikation og et logbibliotek efter eget valg.

3. Brugerdefineret implementering

En af anvendelsestilfælde af HandlerInterceptor tilføjer fælles / brugerspecifikke parametre til en model, som vil være tilgængelig i hver genereret visning.

I vores eksempel bruger vi brugerdefineret interceptorimplementering til at tilføje logget brugers brugernavn til modelparametre. I mere komplekse systemer kan vi tilføje mere specifikke oplysninger som: brugeravatarsti, brugerplacering osv.

Lad os starte med at definere vores nye Interceptor klasse:

offentlig klasse UserInterceptor udvider HandlerInterceptorAdapter {privat statisk loggerlog = LoggerFactory.getLogger (UserInterceptor.class); ...}

Vi forlænger HandlerInterceptorAdapter, som vi kun vil implementere preHandle () og postHandle () metoder.

Som vi nævnte før, vil vi føje logget brugernavn til en model. Først og fremmest skal vi kontrollere, om en bruger er logget ind. Vi kan få disse oplysninger ved at kontrollere SecurityContextHolder:

offentlig statisk boolesk isUserLogged () {prøv {return! SecurityContextHolder.getContext (). getAuthentication () .getName (). er lig med ("anonymousUser"); } fange (Undtagelse e) {returner falsk; }}

Når en HttpSession er oprettet, men ingen er logget ind, et brugernavn i Spring Security-sammenhæng er lig med anonym bruger. Dernæst fortsætter vi med implementeringen af preHandle ():

3.1. Metode preHandle ()

Før vi behandler en anmodning, kan vi ikke få adgang til modelparametre. For at tilføje brugernavn skal vi bruge HttpSession at indstille parametre:

@Override offentlig boolsk preHandle (HttpServletRequest anmodning, HttpServletResponse svar, Objekt objekt) kaster Undtagelse {hvis (isUserLogged ()) {addToModelUserDetails (request.getSession ()); } returner sandt }

Dette er afgørende, hvis vi bruger nogle af disse oplysninger, inden vi behandler en anmodning. Som vi ser, kontrollerer vi, om en bruger er logget ind, og tilføjer derefter parametre til vores anmodning ved at få sin session:

privat ugyldigt addToModelUserDetails (HttpSession-session) {log.info ("================= addToModelUserDetails ======================= ==== "); Streng logget brugernavn = SecurityContextHolder.getContext (). GetAuthentication (). GetName (); session.setAttribute ("brugernavn", logget brugernavn); log.info ("bruger (" + logget brugernavn + ") session:" + session); log.info ("================ addToModelUserDetails ==========================="); }

Vi brugte SecurityContextHolder at opnå logget brugernavn. Du kan tilsidesætte Spring Security UserDetails implementering for at få e-mail i stedet for et standard brugernavn.

3.2. Metode sostHandle ()

Efter håndtering af en anmodning er vores modelparametre tilgængelige, så vi kan få adgang til dem for at ændre værdier eller tilføje nye. For at gøre det bruger vi det tilsidesatte postHandle () metode:

@Override public void postHandle (HttpServletRequest req, HttpServletResponse res, Object o, ModelAndView model) throw Exception {if (model! = Null &&! IsRedirectView (model)) {if (isUserLogged ()) {addToModelUserDetails (model); }}}

Lad os se på implementeringsoplysningerne.

Først og fremmest er det bedre at kontrollere, om modellen ikke er nul. Det forhindrer os i at støde på en NullPointerException.

Desuden kan vi kontrollere, om en Udsigt er ikke en forekomst af omdirigeringUdsigt.

Der er ikke behov for at tilføje / ændre parametre, efter at anmodningen er håndteret og derefter omdirigeret, som straks udfører den nye controller håndtering igen. For at kontrollere, om visningen omdirigeres, introducerer vi følgende metode:

offentlig statisk boolsk isRedirectView (ModelAndView mv) {String viewName = mv.getViewName (); hvis (viewName.startsWith ("redirect: /")) {returner sand; } Vis visning = mv.getView (); returner (visning! = null && visning af SmartView && ((SmartView) visning) .isRedirectView ()); }

Endelig kontrollerer vi igen, om en bruger er logget, og hvis ja, tilføjer vi parametre til Spring-modellen:

privat ugyldigt addToModelUserDetails (ModelAndView-model) {log.info ("================ addToModelUserDetails ======================= ==== "); Streng logget brugernavn = SecurityContextHolder.getContext () .getAuthentication (). GetName (); model.addObject ("logget brugernavn", logget brugernavn); log.trace ("session:" + model.getModel ()); log.info ("================ addToModelUserDetails ==========================="); }

Bemærk, at logning er meget vigtigt, da denne logik fungerer "bag kulisserne" i vores applikation. Det er let at glemme, at vi ændrer nogle modelparametre på hver Udsigt uden at logge det ordentligt.

4. Konfiguration

For at tilføje vores nyoprettede Interceptor i Spring-konfiguration skal vi tilsidesætte addInterceptors () metode indeni WebConfig klasse, der implementerer WebMvcConfigurer:

@Override offentlige ugyldige addInterceptors (InterceptorRegistry registry) {registry.addInterceptor (ny UserInterceptor ()); }

Vi opnår muligvis den samme konfiguration ved at redigere vores XML Spring-konfigurationsfil:

Fra dette øjeblik kan vi få adgang til alle brugerrelaterede parametre på alle genererede visninger.

Bemærk, hvis der er flere forår Opfangere er konfigureret, er preHandle () metode udføres i konfigurationsrækkefølgen, mens postHandle () og afterCompletion () metoder påberåbes i omvendt rækkefølge.

5. Konklusion

Denne vejledning præsenterer aflytning af webanmodninger ved hjælp af Spring MVCs HandlerInterceptor for at give brugerinformation.

I dette særlige eksempel fokuserede vi på at tilføje loggede brugeroplysninger i vores webapplikation til modelparametre. Du kan udvide dette HandlerInterceptor implementering ved at tilføje mere detaljerede oplysninger.

Alle eksempler og konfigurationer er tilgængelige her på GitHub.

5.1. Artikler i serien

Alle artikler i serien:

  • Introduktion til Spring MVC Handler Interceptors
  • Ændring af fjedermodelparametre med Handler Interceptor (denne)