文章目录

前言

在框架 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

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

  1. 判断返回值类型是否是字符类型?
    否 —— 解析返回值类型 R
    在这里插入图片描述
  2. 判断是否是资源类型?

    在这里插入图片描述
  3. 判断是否设置了 contentType ?
    否 —— 获取 selectedMediaType 为 application/json
    在这里插入图片描述
  4. 遍历所有消息转换器,使用转换器写出消息。
    在这里插入图片描述

#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 消息。

Logo

快速构建 Web 应用程序

更多推荐