若依框架中有Sensitive注解,但代码中并未使用,但该注解的实现还是比较值的学习的。
- 该注解是一个运行时注解
- 该注解只能应用在字段上
- JacksonAnnotationsInside 表示当使用Jackson序列化时,Jackson会自动识别该注解下的其他Jackson相关注解,也就是JsonSerialze, 如果没有JacksonAnnotationsInside 注解,jackson序列化过程中不会识别JsonSerialize注解,该注解无效。
- JsonSerialize 核心注解,序列化过程中调用
- 注解参数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) 含义是执行对应类型的脱敏方法,最终实现脱敏
举个例子
在用户表中将邮箱设置为脱敏信息
前端使用普通用户登录,可以看到 邮箱已经变成密文了