Requisitos: O projeto precisa modificar dinamicamente os parâmetros de requisição, atribuir valores aos parâmetros de requisição de acordo com as permissões do usuário atual, antes que os parâmetros entrem no método controlador, a modificação dos parâmetros de requisição deve ser concluída e, quando o controlador chama a camada de serviço, os parâmetros de requisição podem ser usados como condições para consultar e modificar os dados. Existem dois casos de parâmetros de solicitação:
- Para usuários com privilégios elevados, você pode usar os valores reais dos parâmetros solicitados
- Para pessoas com permissões apenas parciais, os valores dos parâmetros de solicitação são modificados dinamicamente com base nas informações vinculadas ao usuário atual
No começo, eu queria implementar isso por um filtro, mas era muito trabalhoso serializar e desserializar o conteúdo do pedido, além de exigir muito julgamento lógico e perda de desempenho. Felizmente, o Spring oferece funcionalidade AOP orientada a face, que pode ser implementada com código simples.
Primeiramente, o projeto Maven pom.xml precisa introduzir o pacote spring-boot-starter-aop, da seguinte forma:
Uma vez que o pacote seja introduzido, podemos usar o recurso AOP, através de@Aspectanotação.
O Aspect suporta 5 tipos de anotações de notificação:
@Before: Pré-notificação, que é executada antes da execução do método
@After: Post-notification, executado após a execução do método
@AfterRunning: Retorna uma notificação, que é executada após o método retornar um resultado
@AfterThrowing: Notificação de exceção, após o método lançar uma exceção
@Around: Notificações de wraparound, ao redor da execução do método
Crie uma Request.java classe genérica de wrapper de pedido:
Crie uma nova classe de dados UserInfo.java solicite específica:
Se o cabeçalho atual da requisição tiver um appid, o valor do parâmetro de requisição appId será modificado; caso contrário, o parâmetro de requisição não será modificado, o código é o seguinte:
Crie um novo controlador HomeController e adicione uma interface com um parâmetro de solicitação contendo Request<UserInfo>, o código é o seguinte:
No caso de testes sem o cabeçalho de requisição appId, o parâmetro de requisição appId é o valor real e não foi modificado, como mostrado na figura a seguir:
Se você tentar adicionar o cabeçalho de solicitação appId, verá que o parâmetro de solicitação appId foi modificado com sucesso, como mostrado na figura a seguir:
Por fim, anexe o código-fonte:O login do hiperlink está visível.
|