@Aspect 拦截处理自定义FIELD、PARAMETER
项目采用springboot提供接口服务,原来的业务是,所有消费者提交的数据全部都是加密信息,例如:127.0.0.1/service?data1=密文&data2=密文&data3=密文
;
服务需要对所有的数据进行解码,然后才是业务计算,因此,针对业务需要,设计了拦截器对数据统一解码。但近期业务调整,消费者提交数据不再是全部加密,例如:127.0.0.1/service?data1=密文&data2=密文&data3=明文
;
因此,服务就需要分别对待进行解码,略笨的办法就是,在之前的拦截器中使用异常处理,对内容解码时增加异常捕获,异常了(解码失败)的就不会被解码。
虽然方案挫了些(不论数据是否为密文,都会走一次解码过程),但好歹能用。但我相信,肯定有更优的方案,所以想要对此进行优化,目前首先想到的就是使用自定义注解(类似@valid),在方法参数中或Bean对象成员上,对需要解码的入参或字段增加自定义的注解,然后使用AOP切面,对注解内容进行统一解码(理论上感觉挺好,相比较异常机制,只有需要解码而且只有在实际使用数据时才会被解码)。
==================华丽丽的分割线===================================
实现:
创建2个注解:
/**
*作用在方法上,用来标记方法需要进行解码
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD })
public @interface Decryption{
}
/**
*作用在方法参数、javaBean的Field,用来标记数据需要解码,并且指定不同解码器(可能会存在不同的加解密)
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD})
public @interface DecodeParam{
//默认使用DES解码器解码
DecoderEnum decoder() default DecoderEnum.DES;
}
/**
* 自定义解码注解解释器
*/
@Aspect
@Component
public class DecryptionResolver {
@Pointcut("execution(* * *(..)) && @annotation(com.annotation.Decryption)")
public void desPoint() {
}
/*
省略具体解析处理代码,主要逻辑就是:
* 对拦截的方法参数列表进行遍历
* 判断参数类型(考虑到复杂对象等,需要递归处理)
* 提取参数注解并判断有没有自定义解码器
* 对数据进行解码并回写结果
*/
}
以上代码实现了业务要求,但需要写2个注解,感觉不友好,于是想能不能只用@DecodeParam
注解,然鹅,结果就是,@Aspect
中,不会直接拦截参数或JavaBean的Field的注解,想请教一下各位看官,有没有办法让@Aspect
可以对参数注解直接生效的,或者,你们处理类似这种业务的方案思路。感激不尽~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论