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