若依框架中有Sensitive注解,但代码中并未使用,但该注解的实现还是比较值的学习的。

在这里插入图片描述

  1. 该注解是一个运行时注解
  2. 该注解只能应用在字段上
  3. JacksonAnnotationsInside 表示当使用Jackson序列化时,Jackson会自动识别该注解下的其他Jackson相关注解,也就是JsonSerialze, 如果没有JacksonAnnotationsInside 注解,jackson序列化过程中不会识别JsonSerialize注解,该注解无效。
  4. JsonSerialize 核心注解,序列化过程中调用
  5. 注解参数desensitizedType 指明是密码、邮箱还是其他需要脱敏的类型。

下面查看 SensitiveJsonSerializer 序列化类的实现方式

ContextualSerializer 是 Jackson
提供的一个接口,允许序列化器(JsonSerializer)根据字段或方法的上下文信息(如注解、类型等)动态调整序列化行为。它通过 createContextual() 方法实现,该方法在序列化前被调用。

createContextual

第一个参数prov是Jackson 的序列化工具,可用于获取配置信息,第二个字段是当前字段/方法的元信息,可获取注解、类型等
在这里插入图片描述

  • 如果当前字段有Sensitive注解修饰,且该字段是String类型,则将该字段对应的desensitizedType保存,也就是邮箱、密码还是其他类型。

  • findValueSerializer 默认情况:使用 Jackson 默认的序列化器

serialize

在序列化过程中调用serialize()方法

@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    if (desensitization()) {  // 检查是否需要脱敏
        gen.writeString(desensitizedType.desensitizer().apply(value)); // 调用脱敏逻辑
    } else {
        gen.writeString(value); // 直接输出原值
    }
}

第一个参数是要序列化的原值
第二个参数是Jackson 的 JSON 生成器,用于写入处理后的值。
第三个参数是提供序列化上下文(通常用不到)。

desensitization() 含义是:如果是admin不进行任何脱敏,注解获取明文值

desensitizedType.desensitizer().apply(value) 含义是执行对应类型的脱敏方法,最终实现脱敏
在这里插入图片描述

举个例子

在用户表中将邮箱设置为脱敏信息
在这里插入图片描述
前端使用普通用户登录,可以看到 邮箱已经变成密文了
在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐