使用自定义注解来完成日志脱敏
1 定义枚举类型
/**
* 日志脱敏类型
*/
public enum SensitiveType {
ID_CARD,
PHONE,
NAME
}
2 定义注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SensitiveInfo {
SensitiveType type();
}
3 为敏感字段指定脱敏的类型
这里只对name第一个字进行脱敏
其它可举一反三。
/**
* 数据库字段和实体类字段映射
* 最好保持一致
*/
@TableField("name")
@Description(desc = "wangsiyu")
@StringRange(max=5)
@SensitiveInfo(type = SensitiveType.NAME)
private String name;
4 反射
/**
* 参数的脱敏
*
* @param object
* @return
*/
public static String toJSONString(Object object) {
try {
return JSON.toJSONString(object, getValueFilter());
} catch (Exception e) {
return ToStringBuilder.reflectionToString(object);
}
}
/**
* 脱敏的规则
* @return
*/
private static ValueFilter getValueFilter() {
return (obj, key, value) -> {
// obj-对象 key-字段名 value-字段值
try {
// 通过反射获取获取每个类的属性
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
if (!field.getName().equals(key)) {
continue;
}
if (field.isAnnotationPresent(SensitiveInfo.class)) {
SensitiveInfo annotation = field.getAnnotation(SensitiveInfo.class);
// 若有,则执行相应字段的脱敏方法
if (null != annotation) {
SensitiveType type = annotation.type();
if (type.equals(SensitiveType.NAME)) {
value = "**" + value.toString().substring(1);
}
}
}
}
} catch (Exception e) {
log.error("To JSON String fail", e);
}
return value;
};
}
我对任何唾手而得,快速,出自本能,即兴,含混的事物没有信心。我相信缓慢,平和,细水长流的力量,踏实,冷静。我不相信缺乏自律精神和不自我建设,不努力,可以得到个人或集体的解放。