Вимоги: Проєкт має динамічно змінювати параметри запиту, призначати значення параметрам запиту відповідно до дозволів поточного користувача, перед тим, як параметри потраплять у метод контролера, необхідно завершити зміну параметрів запиту, а коли контролер викликає сервісний рівень, параметри запиту можуть використовуватися як умови для запиту та зміни даних. Існує два випадки запиту параметрів:
- Для користувачів із високими привілеями можна використовувати фактично запитувані значення параметрів
- Для людей із лише частковими правами значення параметрів запиту динамічно змінюються залежно від інформації, пов'язаної з поточним користувачем
Спочатку я хотів реалізувати це через фільтр, але було надто громіздко серіалізувати та десеріалізувати контент запитів, а також вимагало багато логічного судження та втрати продуктивності. На щастя, Spring надає функціонал AOP, орієнтований на обличчя, який можна реалізувати простим кодом.
По-перше, pom.xml проєкту Maven має представити пакет spring-boot-starter-aop, а саме:
Після впровадження пакету ми можемо використовувати функцію AOP через@AspectАнотації.
Аспект підтримує 5 типів анотації сповіщень:
@Before: Попереднє сповіщення, яке виконується перед виконанням методу
@After: Пост-сповіщення, виконується після виконання методу
@AfterRunning: Повертає сповіщення, яке виконується після того, як метод повертає результат
@AfterThrowing: Сповіщення про виключення, після того, як метод видає виключення
@Around: Сповіщення про обхід, навколо виконання методу
Створіть Request.java універсальний клас обгортки запитів:
Створіть новий UserInfo.java запит на конкретний клас даних:
Якщо поточний заголовок запиту має appid, значення параметра запиту appId буде змінено, інакше параметр запиту не змінюється, код виглядає так:
Створіть новий контролер HomeController і додайте інтерфейс із параметром запиту, що містить Request<UserInfo>, код виглядає так:
У випадку тестування без заголовка запиту appId, параметр запиту appId є фактичним значенням і не змінювався, як показано на наступному рисунку:
Якщо спробувати додати заголовок запиту appId, можна побачити, що параметр запиту appId успішно змінено, як показано на наступному рисунку:
Нарешті, додайте вихідний код:Вхід за гіперпосиланням видно.
|