Sensitive:
package com.sdkj.hookstest.annotation;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.sdkj.hookstest.config.SensitiveJsonSerializer;
import com.sdkj.hookstest.enums.SensitiveStrategy;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
//脱敏策略
SensitiveStrategy strategy();
}
SensitiveJsonSerializer:
package com.sdkj.hookstest.config; 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 com.sdkj.hookstest.annotation.Sensitive; import com.sdkj.hookstest.enums.SensitiveStrategy; import java.io.IOException; import java.util.Objects; public class SensitiveJsonSerializer extends JsonSerializerimplements ContextualSerializer { private SensitiveStrategy strategy; @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 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); } }
Person:
package com.sdkj.hookstest.entity;
import com.sdkj.hookstest.annotation.Sensitive;
import com.sdkj.hookstest.enums.SensitiveStrategy;
import lombok.Data;
@Data
public class Person {
@Sensitive(strategy = SensitiveStrategy.USERNAME)
private String realName;
@Sensitive(strategy = SensitiveStrategy.ADDRESS)
private String address;
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phoneNumber;
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String idCard;
}
SensitiveStrategy:
package com.sdkj.hookstest.enums;
import java.util.function.Function;
public enum SensitiveStrategy {
USERNAME(s -> s.replaceAll("(\S)\S(\S*)", "11111")),
ID_CARD(s -> s.replaceAll("(\d{4})\d{10}(\w{4})", "$1****$2")),
PHONE(s -> s.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2")),
ADDRESS(s -> s.replaceAll("(\S{3})\S{2}(\S*)\S{2}", "$1****$2****"));
private final Function desensitizer;
SensitiveStrategy(Function desensitizer) {
this.desensitizer = desensitizer;
}
public Function desensitizer() {
return desensitizer;
}
}
TestController:
package com.sdkj.hookstest.controller;
import com.sdkj.hookstest.entity.Person;
import com.sdkj.hookstest.web.ServerResponse;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin
@RequestMapping("/tt")
public class TestController {
@GetMapping("/test")
public ServerResponse test(){
Person user = new Person();
user.setRealName("张三");
user.setPhoneNumber("18253100476");
user.setAddress("山东省济南市历下区");
user.setIdCard("371002199405311038");
return ServerResponse.createBySuccess(user);
}
}
最终效果:



