若依框架中有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) 含義是執行對應類型的脫敏方法,最終實現脫敏
舉個例子
在用戶表中將郵箱設置為脫敏信息
前端使用普通用戶登錄,可以看到 郵箱已經變成密文了