策略模式+自定义脱敏注解轻松实现脱敏功能
一、定义注解及其通用类型
1、定义脱敏注解 @SensitiveField
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@JsonSerialize(using = SensitiveInfoSerialize.class)
@JacksonAnnotationsInside
public @interface SensitiveField {
/**
* 脱敏类型
* @return
*/
SensitiveType type() default SensitiveType.NULL;
/**
* 前部显示字符个数
* @return
*/
int prefix() default 4;
/**
* 尾部显示字符个数
* @return
*/
int suffix() default 3;
/**
* 星号个数
* @return
*/
int split() default 3;
}
2、定义脱敏类型 SensitiveType.class
public enum SensitiveType {
/**
* 中文名
*/
CHINESE_NAME,
/**
* 身份证号
*/
ID_CARD,
/**
* 座机号
*/
FIXED_PHONE,
/**
* 手机号
*/
MOBILE_PHONE,
/**
* 电子邮件
*/
EMAIL,
/**
* 银行卡
*/
BANK_CARD,
/**
* 公司开户银行联号
*/
CNAPS_CODE,
/**
* 不脱敏
*/
NULL;
}
二、定义配置文件及拦截器
1、配置文件类 SensitiveInfoProperties.class
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 默认为启用状态,若是配置文件中配置为禁用,则会触发拦截器
*/
@ConfigurationProperties(prefix = SensitiveInfoProperties.FIELD_SENSITIVE_PREFIX)
public class SensitiveInfoProperties {
/**
* 默认的数据脱敏配置前缀
*/
public final static String FIELD_SENSITIVE_PREFIX = "tomcoder.sensitive";
/**
* 脱敏配置是否启用标识_value
*/
public final static String FIELD_SENSITIVE_DISABLE_VALUE = "true";
/**
* 脱敏配置是否启用标识_key
*/
public final static String FIELD_SENSITIVE_KEY = "disable";
/**
* 是否启用脱敏标识(value默认true启用)
*/
private String disable = FIELD_SENSITIVE_DISABLE_VALUE;
public String getDisable() {
return disable;
}
public void setDisable(String disable) {
this.disable = disable;
}
}
2、禁用拦截类 DisableSensitiveInfoIntrospector.class
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import java.lang.annotation.Annotation;
/**
* 拦截器生效时,注解为@SensitiveField 不生效(返回false)
* JacksonAnnotationIntrospector 为序列化时的拦截器接口
*/
public class DisableSensitiveInfoIntrospector extends JacksonAnnotationIntrospector {
private static final long serialVersionUID = 5915688650237481024L;
@Override
public boolean isAnnotationBundle(Annotation ann) {
if (ann.annotationType().equals(SensitiveField.class)) {
return false;
} else {
return super.isAnnotationBundle(ann);
}
}
}
3、处理配置并依赖注入拦截器类 SensitiveInfoConfiguration.class
import c