Veranderen van veermodelparameters met Handler Interceptor

1. Inleiding

In deze tutorial gaan we ons concentreren op de Spring MVC HandlerInterceptor. Meer specifiek zullen we de modelparameters van Spring MVC wijzigen voor en na het afhandelen van een verzoek.

Als je er meer over wilt lezen Van HandlerInterceptor basisprincipes, bekijk dan dit artikel.

2. Maven afhankelijkheden

Om te kunnen gebruiken Onderscheppers, moet u de volgende sectie opnemen in een afhankelijkheden sectie van uw pom.xml het dossier:

 org.springframework spring-web 5.2.8.RELEASE 

De laatste versie is hier te vinden.

Deze afhankelijkheid dekt alleen Spring Web, dus vergeet niet om s toe te voegenpring-core en lente-context voor een volledige webapplicatie en een logboekregistratiebibliotheek naar keuze.

3. Aangepaste implementatie

Een van de use cases van HandlerInterceptor is het toevoegen van algemene / gebruikersspecifieke parameters aan een model, die beschikbaar zullen zijn in elke gegenereerde weergave.

In ons voorbeeld zullen we een aangepaste interceptorimplementatie gebruiken om de gebruikersnaam van de geregistreerde gebruiker toe te voegen aan modelparameters. In complexere systemen kunnen we meer specifieke informatie toevoegen, zoals: gebruikersavatarpad, gebruikerslocatie, enz.

Laten we beginnen met het definiëren van onze nieuwe Onderschepper klasse:

openbare klasse UserInterceptor breidt HandlerInterceptorAdapter {privé statisch logboeklogboek = LoggerFactory.getLogger (UserInterceptor.class) uit; ...}

We verlengen HandlerInterceptorAdapter, zoals we alleen willen implementeren preHandle () en postHandle () methoden.

Zoals we eerder vermeldden, willen we de naam van een gelogde gebruiker aan een model toevoegen. Allereerst moeten we controleren of een gebruiker is ingelogd. We kunnen deze informatie verkrijgen door dit te controleren SecurityContextHolder:

openbare statische boolean isUserLogged () {probeer {return! SecurityContextHolder.getContext (). getAuthentication () .getName (). equals ("anonymousUser"); } catch (uitzondering e) {return false; }}

Wanneer een HttpSession is vastgesteld, maar niemand is ingelogd, een gebruikersnaam in Spring Security-context is gelijk aan Anonieme gebruiker. Vervolgens gaan we verder met de implementatie van preHandle ():

3.1. Methode preHandle ()

Voordat we een verzoek behandelen, hebben we geen toegang tot modelparameters. Om een ​​gebruikersnaam toe te voegen, moeten we gebruiken HttpSession om parameters in te stellen:

@Override openbare boolean preHandle (HttpServletRequest-verzoek, HttpServletResponse-antwoord, Object-object) genereert een uitzondering {if (isUserLogged ()) {addToModelUserDetails (request.getSession ()); } retourneren waar; }

Dit is cruciaal als we een deel van deze informatie gebruiken voordat we een verzoek behandelen. Zoals we zien, controleren we of een gebruiker is aangemeld en voegen we vervolgens parameters toe aan ons verzoek door de sessie te verkrijgen:

privé ongeldig addToModelUserDetails (HttpSession-sessie) {log.info ("=============== addToModelUserDetails ===================== ==== "); String ingelogdUsername = SecurityContextHolder.getContext (). GetAuthentication (). GetName (); session.setAttribute ("gebruikersnaam", registeredUsername); log.info ("gebruiker (" + ingelogdGebruikersnaam + ") sessie:" + sessie); log.info ("=============== addToModelUserDetails ========================="); }

We gebruikten SecurityContextHolder verkrijgen ingelogdUsername. U kunt Spring Security opheffen Gebruikersdetails implementatie om e-mail te verkrijgen in plaats van een standaard gebruikersnaam.

3.2. Methode postHandle ()

Nadat we een verzoek hebben afgehandeld, zijn onze modelparameters beschikbaar, zodat we ze kunnen openen om waarden te wijzigen of nieuwe toe te voegen. Om dat te doen, gebruiken we de overschreven postHandle () methode:

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

Laten we de implementatiedetails eens bekijken.

Allereerst is het beter om te controleren of het model dat niet is nul. Het voorkomt dat we een NullPointerException.

Bovendien kunnen we controleren of a Visie is geen instantie van RedirectVisie.

Het is niet nodig om parameters toe te voegen / te wijzigen nadat het verzoek is afgehandeld en vervolgens is doorgestuurd, aangezien de nieuwe controller onmiddellijk de afhandeling zal uitvoeren. Om te controleren of de weergave wordt omgeleid, introduceren we de volgende methode:

openbare statische boolean isRedirectView (ModelAndView mv) {String viewName = mv.getViewName (); if (viewName.startsWith ("redirect: /")) {return true; } Bekijk view = mv.getView (); return (view! = null && view instance of SmartView && ((SmartView) view) .isRedirectView ()); }

Ten slotte controleren we opnieuw of een gebruiker is ingelogd, en zo ja, dan voegen we parameters toe aan het Spring-model:

privé ongeldig addToModelUserDetails (ModelAndView-model) {log.info ("=============== addToModelUserDetails ===================== ==== "); String ingelogdUsername = SecurityContextHolder.getContext () .getAuthentication (). GetName (); model.addObject ("ingelogdGebruikersnaam", ingelogdGebruikersnaam); log.trace ("sessie:" + model.getModel ()); log.info ("=============== addToModelUserDetails ========================="); }

Houd er rekening mee dat loggen erg belangrijk is, aangezien deze logica "achter de schermen" van onze applicatie werkt. Het is gemakkelijk om te vergeten dat we enkele modelparameters op elk ervan wijzigen Visie zonder het correct te loggen.

4. Configuratie

Om onze nieuw gemaakte Onderschepper in de Spring-configuratie, moeten we overschrijven addInterceptors () methode binnen Webconfiguratie klasse die implementeert WebMvcConfigurer:

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

We kunnen dezelfde configuratie bereiken door ons XML Spring-configuratiebestand te bewerken:

Vanaf dit moment hebben we toegang tot alle gebruikersgerelateerde parameters op alle gegenereerde weergaven.

Let op, als er meerdere Spring Onderscheppers zijn geconfigureerd, de preHandle () methode wordt uitgevoerd in de volgorde van configuratie while postHandle () en na voltooiing() methoden worden in omgekeerde volgorde aangeroepen.

5. Conclusie

Deze tutorial presenteert het onderscheppen van webverzoeken met behulp van Spring MVC's HandlerInterceptor om gebruikersinformatie te verstrekken.

In dit specifieke voorbeeld hebben we ons gericht op het toevoegen van geregistreerde gebruikersgegevens in onze webtoepassing aan modelparameters. U kunt dit verlengen HandlerInterceptor implementatie door meer gedetailleerde informatie toe te voegen.

Alle voorbeelden en configuraties zijn hier beschikbaar op GitHub.

5.1. Artikelen in de serie

Alle artikelen uit de serie:

  • Inleiding tot Spring MVC Handler Interceptors
  • Veermodelparameters wijzigen met Handler Interceptor (deze)

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