使用自定义注解来完成日志脱敏

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;
        };
    }

posted @ 2021-12-13 20:40  姚狗蛋  阅读(43)  评论(0编辑  收藏  举报