Wymagania: Projekt musi dynamicznie modyfikować parametry żądania, przypisywać im wartości zgodnie z uprawnieniami aktualnego użytkownika, zanim parametry wejdą do metody kontrolera, modyfikacja parametrów żądań musi zostać ukończona, a gdy kontroler wywoła warstwę usługową, parametry żądań mogą być użyte jako warunki do zapytań i modyfikacji danych. Istnieją dwa przypadki żądania parametrów:
- Dla użytkowników z wysokimi uprawnieniami można użyć rzeczywistych żądanych wartości parametrów
- Dla osób posiadających tylko częściowe uprawnienia wartości parametrów żądania są dynamicznie modyfikowane w zależności od informacji powiązanych z aktualnym użytkownikiem
Na początku chciałem zaimplementować to przez filtr, ale serializacja i deserializacja zawartości żądań była zbyt uciążliwa, a także wymagało to dużej logicznej oceny i utraty wydajności. Na szczęście Spring oferuje funkcjonalność AOP zorientowaną na twarze, którą można zaimplementować prostym kodem.
Przede wszystkim projekt maven pom.xml musi wprowadzić pakiet spring-boot-starter-aop, w następujący sposób:
Po wprowadzeniu pakietu możemy korzystać z funkcji AOP, przez@Aspectadnotacja.
Aspect obsługuje 5 typów adnotacji powiadomień:
@Before: Pre-notification, które jest wykonywane przed wykonaniem metody
@After: Post-powiadomienie, wykonywane po wykonaniu metody
@AfterRunning: Zwraca powiadomienie, które jest wykonywane po zwróceniu wyniku przez metodę
@AfterThrowing: Powiadomienie o wyjątku, po wyrzuceniu przez metodę wyjątku
@Around: Powiadomienia wokół instrukcji, wokół wykonywania metod
Stwórz Request.java ogólną klasę oklejania żądań:
Stwórz nową UserInfo.java zażądać konkretnej klasy danych:
Jeśli aktualny nagłówek żądania ma appid, wartość parametru żądania appId zostanie zmodyfikowana, w przeciwnym razie parametr żądania nie zostanie zmodyfikowany, a kod wygląda następująco:
Stwórz nowy kontroler HomeController i dodaj interfejs z parametrem żądania zawierającym Request<UserInfo>, a kod wygląda następująco:
W przypadku testów bez nagłówka żądania appId, parametr żądania appId jest rzeczywistą wartością i nie został zmodyfikowany, jak pokazano na poniższym rysunku:
Jeśli spróbujesz dodać nagłówek żądania appId, zobaczysz, że parametr żądania appId został pomyślnie zmodyfikowany, co pokazano na poniższym rysunku:
Na koniec dołącz kod źródłowy:Logowanie do linku jest widoczne.
|