借助hutool工具 大概是5.7.14版本以上 不然没有脱敏工具类
自定义注解
主要是以这两个注解
@JacksonAnnotationsInside @JsonSerialize(using = SensitiveJsonSerializer.class)在实体类序列化时实现脱敏效果
/**
* 数据脱敏注解
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
SensitiveStrategy strategy();
}
脱敏策略:
import cn.hutool.core.util.DesensitizedUtil;
import lombok.AllArgsConstructor;
import java.util.function.Function;
/**
* 脱敏策略
*
*/
@AllArgsConstructor
public enum SensitiveStrategy {
/**
* 身份证脱敏
*/
ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)),
/**
* 手机号脱敏
*/
PHONE(DesensitizedUtil::mobilePhone),
/**
* 地址脱敏
*/
ADDRESS(s -> DesensitizedUtil.address(s, 8)),
/**
* 邮箱脱敏
*/
EMAIL(DesensitizedUtil::email),
/**
* 银行卡
*/
BANK_CARD(DesensitizedUtil::bankCard),
/**
* 微信号
*/
// WECHAT(DesensitizedUtils::weChat),
;
//可自行添加其他脱敏策略
private final Function<String, String> desensitizer;
public Function<String, String> desensitizer() {
return desensitizer;
}
}
脱敏序列化
import com.example.sugg.demo.aopi.Sensitive;
import com.example.sugg.demo.enumi.SensitiveStrategy;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import java.io.IOException;
import java.util.Objects;
/**
* 数据脱敏json序列化工具
*
*/
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
private SensitiveStrategy strategy;
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
// SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class);
// 这里可以根据业务对不同的角色做脱敏
// if (sensitiveService.isSensitive()) {
// gen.writeString(value);
// } else {
gen.writeString(strategy.desensitizer().apply(value));
// }
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
Sensitive annotation = property.getAnnotation(Sensitive.class);
if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
this.strategy = annotation.strategy();
return this;
}
return prov.findValueSerializer(property.getType(), property);
}
}
测试
@GetMapping("/insert")
public TestSensitive insert(){
// return userService.insert(user);
return TestSensitive.builder().idCard("1234241223123123")
.phone("13068943552")
.email("zhangli@163.com").build();
}
// 实体类
@Builder
@Data
static class TestSensitive {
/**
* 身份证
*/
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String idCard;
/**
* 电话
*/
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phone;
/**
* 邮箱
*/
@Sensitive(strategy = SensitiveStrategy.EMAIL)
private String email;
}
/**
效果
{
"idCard": "123*********3123",
"phone": "130****3552",
"email": "y***********@163.com"
}
*/
701

被折叠的 条评论
为什么被折叠?



