在kotlin中使用springboot ,有一个controller方法: @PostMapping("/yz") fun yz(@RequestBody idVo: IdVo): IdVo { return idVo } 入参实体数据类是: data class IdVo( val id: String ) 我希望在属性id上加一个@DecryptId自定义注解,在进入controller之前,将IdVo的属性id进行解密操作。
时间: 2024-03-25 14:38:08 浏览: 84
spring-boot-starter-crypt:SpringBoot请求统一加解密
在Kotlin中使用SpringBoot,可以通过自定义注解和AOP来实现在进入Controller之前对请求参数进行解密的操作。
首先,定义一个@DecryptId注解:
```kotlin
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class DecryptId
```
然后,定义一个AOP切面来实现解密操作:
```kotlin
@Aspect
@Component
class DecryptIdAspect {
@Autowired
lateinit var encryptUtils: EncryptUtils
@Before("@annotation(com.example.demo.DecryptId)")
fun decryptId(joinPoint: JoinPoint) {
val args = joinPoint.args
for (arg in args) {
if (arg is IdVo) {
val idField = arg::class.memberProperties.find { it.name == "id" }
idField?.let {
val id = it.call(arg) as String
val decryptedId = encryptUtils.decrypt(id)
it.setter.call(arg, decryptedId)
}
}
}
}
}
```
在上述代码中,通过@DecryptId注解指定要解密的属性,然后在AOP切面中找到加了该注解的属性,并进行解密操作。
最后,在Controller中使用@DecryptId注解即可:
```kotlin
@RestController
class IdController {
@PostMapping("/yz")
fun yz(@RequestBody @DecryptId idVo: IdVo): IdVo {
return idVo
}
}
```
这样,在进入Controller之前,@DecryptId注解会触发AOP切面中的解密操作,将请求参数中的id属性解密并重新赋值给IdVo对象的id属性。
阅读全文