JAVA 一个注解搞定SpringBoot接口定制属性加解密

技术版本

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第1张图片

实现过程

1、引入依赖

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第2张图片

2、实体类

我们定义两个实体类,一个是模拟查询用户信息时接口响应返回的对象UserInfo。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第3张图片

一个是保存用户时的请求对象UserInfoReq

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第4张图片

这样,我们就可以分别来测试一下查询接口返回对象敏感属性加密的情况,和保存接口请求对象敏感属性解密的情况了。

3、yml配置

这里,我们主要加上密钥的自定义配置,便于灵活修改。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第5张图片

4、自定义注解

这里,我们给注解定义了两个参数,分别是请求时要给哪些属性解密,以及响应时要给哪些属性加密,并分别给了默认值。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第6张图片

5、加解密工具类

加解密工具类我们使用了Hutool提供的AES加解密工具

这里注意两点:

1)、工具类中获取yml配置,要加上@component注解,然后给变量设置static,但set方法去掉static,@Value获取放在set方法上即可,否则不会生效;

2)、构建AES工具要放在@PostConstruct注解中,表示Spring容器初始化这个Bean之后加载的内容,不这样处理直接构建的话会抛出空指针异常。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第7张图片

6、AOP切面

这里是自定义注解的AOP切面类,也是具体实现,核心思想还是利用Java的反射机制,其中的一些写法大体都是固定的,可以适当理解,不建议过分领悟,以免造成困扰。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第8张图片

7、测试接口

首先,我们来测试一下查询接口,针对返回对象的部分敏感属性进行加密。

这里,我们设置reqPropsName={},表示不对请求参数做加解密操作,设置respPropsName={"phone"、"idCard"、"name"},表示对返回对象中的手机号、身份证号、姓名进行加密返回。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第9张图片

其次,我们来测试一下保存接口,针对请求对象的部分已加密属性进行解密。

这里,我们设置reqPropsName={"phone"、"idCard"、"name"},表示对请求参数中的手机号、身份证号、姓名做解密操作,设置respPropsName={},表示对返回对象不做加密操作。

保存接口执行后我们直接返回这个对象就行,看看是不是已经解密了。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第10张图片

8、效果

查询接口返回对象加密效果

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第11张图片

保存接口请求对象解密效果

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第12张图片

总结

自定义注解可以实现的功能很多,比如之前给大家写过的一篇防重复提交注解,重点是AOP的思想,写法大体上都是固定的。

这里的加解密注解依然有局限性:

1)、只支持有明确公共返回对象的接口,比如这里的Result;

2)、只支持@RequestBody请求对象,其他诸如多个param参数、Map等形式都不支持,可以自行扩展;

虽然不完美,但大体上已经够用,因为大部分SpringBoot项目都是遵循规范的,都会定义公共的返回对象,绝大部分请求接口也都是@RequesetBody来接收的。

2、实体类

我们定义两个实体类,一个是模拟查询用户信息时接口响应返回的对象UserInfo。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第13张图片

一个是保存用户时的请求对象UserInfoReq

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第14张图片

这样,我们就可以分别来测试一下查询接口返回对象敏感属性加密的情况,和保存接口请求对象敏感属性解密的情况了。

3、yml配置

这里,我们主要加上密钥的自定义配置,便于灵活修改。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第15张图片

4、自定义注解

这里,我们给注解定义了两个参数,分别是请求时要给哪些属性解密,以及响应时要给哪些属性加密,并分别给了默认值。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第16张图片

5、加解密工具类

加解密工具类我们使用了Hutool提供的AES加解密工具

这里注意两点:

1)、工具类中获取yml配置,要加上@component注解,然后给变量设置static,但set方法去掉static,@Value获取放在set方法上即可,否则不会生效;

2)、构建AES工具要放在@PostConstruct注解中,表示Spring容器初始化这个Bean之后加载的内容,不这样处理直接构建的话会抛出空指针异常。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第17张图片

6、AOP切面

这里是自定义注解的AOP切面类,也是具体实现,核心思想还是利用Java的反射机制,其中的一些写法大体都是固定的,可以适当理解,不建议过分领悟,以免造成困扰。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第18张图片

7、测试接口

首先,我们来测试一下查询接口,针对返回对象的部分敏感属性进行加密。

这里,我们设置reqPropsName={},表示不对请求参数做加解密操作,设置respPropsName={"phone"、"idCard"、"name"},表示对返回对象中的手机号、身份证号、姓名进行加密返回。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第19张图片

其次,我们来测试一下保存接口,针对请求对象的部分已加密属性进行解密。

这里,我们设置reqPropsName={"phone"、"idCard"、"name"},表示对请求参数中的手机号、身份证号、姓名做解密操作,设置respPropsName={},表示对返回对象不做加密操作。

保存接口执行后我们直接返回这个对象就行,看看是不是已经解密了。

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第20张图片

8、效果

查询接口返回对象加密效果

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第21张图片

保存接口请求对象解密效果

JAVA 一个注解搞定SpringBoot接口定制属性加解密_第22张图片

总结

自定义注解可以实现的功能很多,比如之前给大家写过的一篇防重复提交注解,重点是AOP的思想,写法大体上都是固定的。

这里的加解密注解依然有局限性:

1)、只支持有明确公共返回对象的接口,比如这里的Result;

2)、只支持@RequestBody请求对象,其他诸如多个param参数、Map等形式都不支持,可以自行扩展;

虽然不完美,但大体上已经够用,因为大部分SpringBoot项目都是遵循规范的,都会定义公共的返回对象,绝大部分请求接口也都是@RequesetBody来接收的。

你可能感兴趣的:(java,spring,boot,spring)