@Aspect 拦截处理自定义FIELD、PARAMETER

发布于 2022-09-07 16:16:02 字数 1678 浏览 56 评论 0

项目采用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文