【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)

文章目录

    • 前言
    • 参考目录
    • 功能代码实现及测试
      • 1、数据脱敏注解 `Sensitive`
      • 2、脱敏策略枚举 `SensitiveStrategy`
      • 3、脱敏 Json 序列化器 `SensitiveJsonSerializer`
      • 4、测试类 `TestSensitiveController`
    • 功能调用流程分析
      • ##、流程简图(重点)
      • #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 版本更新了序列化脱敏的功能。
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第1张图片
在 Demo 模块也增加了数据脱敏的测试类 TestSensitiveController,本文来简单分析一下该功能的调用流程。

参考目录

  • GitHub - Jackson

功能代码实现及测试

1、数据脱敏注解 Sensitive

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第2张图片

2、脱敏策略枚举 SensitiveStrategy

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第3张图片
这里所使用的的脱敏工具类底层是 Hutool 的 DesensitizedUtil

3、脱敏 Json 序列化器 SensitiveJsonSerializer

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第4张图片

4、测试类 TestSensitiveController

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第5张图片
需要注意的是,由于在序列化工具中定义了 admin 用户不进行数据脱敏,因此使用 test 用户进行测试,测试结果如下:
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第6张图片

功能调用流程分析

##、流程简图(重点)

首先按照惯例,请记住这张图(后面的流程截图都是基于此):

温馨提醒,由于流程步骤较多(比起以往的多很多),结合这张图走不容易迷路

#1、处理返回结果 RequestResponseBodyMethodProcessor#handleReturnValue

由于前置步骤较多,这里从 REST 请求的处理返回值方法开始进行分析,这里是 Spring Web MVC REST 处理流程的其中一个步骤(处理 HandleMethod 执行结果),如果不熟悉的话可以找相关资料复习一下,这里不做详细说明。
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第7张图片
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第8张图片
执行过程:
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第9张图片

#2、使用消息转换器转换返回结果 AbstractMessageConverterMethodProcessor#writeWithMessageConverters

在该方法中有以下执行步骤:

  1. 判断返回值类型是否是字符类型?
    否 —— 解析返回值类型 R
    【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第10张图片
  2. 判断是否是资源类型?

    【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第11张图片
  3. 判断是否设置了 contentType ?
    否 —— 获取 selectedMediaType 为 application/json
    【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第12张图片
  4. 遍历所有消息转换器,使用转换器写出消息。
    【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第13张图片

#3、AbstractGenericHttpMessageConverter#write

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第14张图片

#4、AbstractJackson2HttpMessageConverter#writeInternal

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第15张图片
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第16张图片

#5、返回值序列化为JSON对象 com.fasterxml.jackson.databind.ObjectWriter#writeValue

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第17张图片

#6、Prefetch#serialize

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第18张图片

#7、DefaultSerializerProvider#serializeValue

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第19张图片

#8、DefaultSerializerProvider#_serialize

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第20张图片

#9、BeanSerializer#serialize

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第21张图片

#10、循环序列化返回值对象所有字段 BeanSerializerBase#serializeFields

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第22张图片

#11、BeanPropertyWriter#serializeAsField

#11.1、判断Json序列化器是否为空?

注:第一次请求时为空,后续请求不为空。

是:获取序列化器 BeanPropertyWriter#_findAndAddDynamic
否:执行步骤 #26 序列化。

#11.2、获取序列化器 BeanPropertyWriter#_findAndAddDynamic

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第23张图片

#12、BeanPropertyWriter#_findAndAddDynamic

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第24张图片

#13、PropertySerializerMap#findAndAddPrimarySerializer

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第25张图片

#14、SerializerProvider#findPrimaryPropertySerializer

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第26张图片

#15、SerializerProvider#_createAndCacheUntypedSerializer

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第27张图片

#16、BeanSerializerFactory#createSerializer

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第28张图片
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第29张图片

#17、BeanSerializerFactory#_createSerializer2

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第30张图片

#18、BeanSerializerFactory#findBeanOrAddOnSerializer

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第31张图片

#19、构造序列化器 BeanSerializerFactory#constructBeanOrAddOnSerializer

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第32张图片
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第33张图片
执行完后面的流程后获得的序列化器:
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第34张图片

#20、获取所有Bean对象属性 BeanSerializerFactory#findBeanProperties

在这里插入图片描述
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第35张图片

#21、循环构造BeanPropertyWriter BeanSerializerFactory#_constructWriter

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第36张图片

#21.1、PropertyBuilder#buildWriter

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第37张图片
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第38张图片
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第39张图片

#22、PropertyBuilder#_constructPropertyWriter

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第40张图片

#23、BeanPropertyWriter#BeanPropertyWriter

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第41张图片
注:将 Json 序列化器保存到上下文中,后面调用不再需要新建。

#24、SerializerProvider#handlePrimaryContextualization

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第42张图片

#25、创建自定义上下文序列化器 SensitiveJsonSerializer#createContextual

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第43张图片

#26、SensitiveJsonSerializer#serialize

继续执行步骤 #11
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第44张图片

#27、自定义数据脱敏 Json 序列化工具 SensitiveJsonSerializer#serialize

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第45张图片

#27.1、获取脱敏策略,根据脱敏策略脱敏

【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第46张图片
【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer(Jackson 源码)_第47张图片

#27.2、JsonGenerator 写出内容

在步骤 #27 方法中,不同字段对应了不同脱敏策略,由于逻辑比较简单可以自行理解,因此这里只展示其中一种,其他流程同理。

至此,完成了所有字段的序列化流程后,将向客户端返回 REST HTTP 消息。

你可能感兴趣的:(框架学习,-,若依,/,RuoYi-Vue-Plus,RuoYi-Vue-Plus,java,Jackson)