【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)
简单分析数据脱敏 Json 序列化工具 SensitiveJsonSerializer,包含 Jackson 源码执行调用流程。
文章目录
- 前言
- 参考目录
- 功能代码实现及测试
- 功能调用流程分析
- ##、流程简图(重点)
- #1、处理返回结果 `RequestResponseBodyMethodProcessor#handleReturnValue`
- #2、使用消息转换器转换返回结果 `AbstractMessageConverterMethodProcessor#writeWithMessageConverters`
- #3、`AbstractGenericHttpMessageConverter#write`
- #4、`AbstractJackson2HttpMessageConverter#writeInternal`
- #5、返回值序列化为JSON对象 `com.fasterxml.jackson.databind.ObjectWriter#writeValue`
- #6、`Prefetch#serialize`
- #7、`DefaultSerializerProvider#serializeValue`
- #8、`DefaultSerializerProvider#_serialize`
- #9、`BeanSerializer#serialize`
- #10、循环序列化返回值对象所有字段 `BeanSerializerBase#serializeFields`
- #11、`BeanPropertyWriter#serializeAsField`
- #11.1、判断Json序列化器是否为空?
- #11.2、获取序列化器 `BeanPropertyWriter#_findAndAddDynamic`
- #12、`BeanPropertyWriter#_findAndAddDynamic`
- #13、`PropertySerializerMap#findAndAddPrimarySerializer`
- #14、`SerializerProvider#findPrimaryPropertySerializer`
- #15、`SerializerProvider#_createAndCacheUntypedSerializer`
- #16、`BeanSerializerFactory#createSerializer`
- #17、`BeanSerializerFactory#_createSerializer2`
- #18、`BeanSerializerFactory#findBeanOrAddOnSerializer`
- #19、构造序列化器 `BeanSerializerFactory#constructBeanOrAddOnSerializer`
- #20、获取所有Bean对象属性 `BeanSerializerFactory#findBeanProperties`
- #21、循环构造BeanPropertyWriter `BeanSerializerFactory#_constructWriter`
- #21.1、`PropertyBuilder#buildWriter`
- #22、`PropertyBuilder#_constructPropertyWriter`
- #23、`BeanPropertyWriter#BeanPropertyWriter`
- #24、`SerializerProvider#handlePrimaryContextualization`
- #25、创建自定义上下文序列化器 `SensitiveJsonSerializer#createContextual`
- #26、`SensitiveJsonSerializer#serialize`
- #27、自定义数据脱敏 Json 序列化工具 `SensitiveJsonSerializer#serialize`
- #27.1、获取脱敏策略,根据脱敏策略脱敏
- #27.2、JsonGenerator 写出内容
前言
在框架 V4.0.0 版本更新了序列化脱敏的功能。
在 Demo 模块也增加了数据脱敏的测试类 TestSensitiveController
,本文来简单分析一下该功能的调用流程。
参考目录
功能代码实现及测试
1、数据脱敏注解 Sensitive
2、脱敏策略枚举 SensitiveStrategy
这里所使用的的脱敏工具类底层是 Hutool 的 DesensitizedUtil
。
3、脱敏 Json 序列化器 SensitiveJsonSerializer
4、测试类 TestSensitiveController
需要注意的是,由于在序列化工具中定义了 admin 用户不进行数据脱敏,因此使用 test 用户进行测试,测试结果如下:
功能调用流程分析
##、流程简图(重点)
首先按照惯例,请记住这张图(后面的流程截图都是基于此):
温馨提醒,由于流程步骤较多(比起以往的多很多),结合这张图走不容易迷路。
#1、处理返回结果 RequestResponseBodyMethodProcessor#handleReturnValue
由于前置步骤较多,这里从 REST 请求的处理返回值方法开始进行分析,这里是 Spring Web MVC REST 处理流程的其中一个步骤(处理 HandleMethod 执行结果),如果不熟悉的话可以找相关资料复习一下,这里不做详细说明。
执行过程:
#2、使用消息转换器转换返回结果 AbstractMessageConverterMethodProcessor#writeWithMessageConverters
在该方法中有以下执行步骤:
- 判断返回值类型是否是字符类型?
否 —— 解析返回值类型 R
- 判断是否是资源类型?
否
- 判断是否设置了 contentType ?
否 —— 获取 selectedMediaType 为 application/json
- 遍历所有消息转换器,使用转换器写出消息。
#3、AbstractGenericHttpMessageConverter#write
#4、AbstractJackson2HttpMessageConverter#writeInternal
#5、返回值序列化为JSON对象 com.fasterxml.jackson.databind.ObjectWriter#writeValue
#6、Prefetch#serialize
#7、DefaultSerializerProvider#serializeValue
#8、DefaultSerializerProvider#_serialize
#9、BeanSerializer#serialize
#10、循环序列化返回值对象所有字段 BeanSerializerBase#serializeFields
#11、BeanPropertyWriter#serializeAsField
#11.1、判断Json序列化器是否为空?
注:第一次请求时为空,后续请求不为空。
是:获取序列化器 BeanPropertyWriter#_findAndAddDynamic
;
否:执行步骤 #26
序列化。
#11.2、获取序列化器 BeanPropertyWriter#_findAndAddDynamic
#12、BeanPropertyWriter#_findAndAddDynamic
#13、PropertySerializerMap#findAndAddPrimarySerializer
#14、SerializerProvider#findPrimaryPropertySerializer
#15、SerializerProvider#_createAndCacheUntypedSerializer
#16、BeanSerializerFactory#createSerializer
#17、BeanSerializerFactory#_createSerializer2
#18、BeanSerializerFactory#findBeanOrAddOnSerializer
#19、构造序列化器 BeanSerializerFactory#constructBeanOrAddOnSerializer
执行完后面的流程后获得的序列化器:
#20、获取所有Bean对象属性 BeanSerializerFactory#findBeanProperties
#21、循环构造BeanPropertyWriter BeanSerializerFactory#_constructWriter
#21.1、PropertyBuilder#buildWriter
#22、PropertyBuilder#_constructPropertyWriter
#23、BeanPropertyWriter#BeanPropertyWriter
注:将 Json 序列化器保存到上下文中,后面调用不再需要新建。
#24、SerializerProvider#handlePrimaryContextualization
#25、创建自定义上下文序列化器 SensitiveJsonSerializer#createContextual
#26、SensitiveJsonSerializer#serialize
继续执行步骤 #11
。
#27、自定义数据脱敏 Json 序列化工具 SensitiveJsonSerializer#serialize
#27.1、获取脱敏策略,根据脱敏策略脱敏
#27.2、JsonGenerator 写出内容
在步骤 #27
方法中,不同字段对应了不同脱敏策略,由于逻辑比较简单可以自行理解,因此这里只展示其中一种,其他流程同理。
至此,完成了所有字段的序列化流程后,将向客户端返回 REST HTTP 消息。
更多推荐
所有评论(0)