Eisen: Het project moet de verzoekparameters dynamisch wijzigen, om waarden toe te wijzen aan de verzoekparameters volgens de rechten van de huidige gebruiker; voordat de parameters in de controllermethode komen, moet de wijziging van de verzoekparameters worden voltooid, en wanneer de controller de servicelaag oproept, kunnen de verzoekparameters worden gebruikt als voorwaarden om de data te bevragen en te wijzigen. Er zijn twee gevallen van verzoekende parameters:
- Voor gebruikers met hoge rechten kun je de daadwerkelijk gevraagde parameterwaarden gebruiken
- Voor mensen met slechts gedeeltelijke rechten worden de parameters van het verzoek dynamisch aangepast op basis van de informatie die aan de huidige gebruiker is gebonden
In het begin wilde ik het via een filter implementeren, maar het was te omslachtig om de verzoekinhoud te serialiseren en te deserialiseren, en het vereiste ook veel logisch oordeel en prestatieverlies. Gelukkig biedt Spring AOP-georiënteerde functionaliteit, die met eenvoudige code kan worden geïmplementeerd.
Allereerst moet het Maven-project pom.xml het spring-boot-starter-aop pakket introduceren, als volgt:
Zodra het pakket is geïntroduceerd, kunnen we de AOP-functie gebruiken, via@Aspectaantekening.
Aspect ondersteunt 5 soorten notificatie-annotaties:
@Before: Pre-notificatie, die wordt uitgevoerd voordat de methode wordt uitgevoerd
@After: Na de melding, uitgevoerd nadat de methode is uitgevoerd
@AfterRunning: Geeft een melding terug, die wordt uitgevoerd nadat de methode een resultaat heeft teruggegeven
@AfterThrowing: Uitzonderingsmelding, nadat de methode een uitzondering heeft gegooid
@Around: Wraparound-meldingen, rondom methode-uitvoering
Maak een Request.java generieke request wrapper-klasse aan:
Maak een nieuwe UserInfo.java vraag specifieke dataklasse aan:
Als de huidige request-header een appid heeft, wordt de waarde van de requestparameter appId gewijzigd, anders wordt de requestparameter niet gewijzigd, de code is als volgt:
Maak een nieuwe HomeController-controller aan en voeg een interface toe met een request-parameter die Request bevat<UserInfo>; de code is als volgt:
In het geval van testen zonder de appId-requestheader is de requestparameter appId de werkelijke waarde en is niet gewijzigd, zoals weergegeven in de volgende figuur:
Als je probeert de appId-verzoekheader toe te voegen, zie je dat de appId-verzoekparameter succesvol is gewijzigd, zoals weergegeven in de volgende figuur:
Voeg tenslotte de broncode bij:De hyperlink-login is zichtbaar.
|