pom
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.18</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
自定义注解
import java.lang.annotation.*;
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD, ElementType.TYPE})
@Inherited
public @interface DesensitizeSupport {
}
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.TYPE, ElementType.METHOD,ElementType.FIELD})
public @interface Desensitized {
DesensitizeType type() default DesensitizeType.NONE;
}
注解类型枚举
public enum DesensitizeType {
NONE,
NAME,
ID_CARD_18,
EMAIL,
MOBILE_PHONE;
}
返回的参数准备
import com.zm.config.DesensitizeType;
import com.zm.config.Desensitized;
import java.util.List;
public class UserModel {
@Desensitized(type = DesensitizeType.NAME)
private String name;
@Desensitized
private List<Address> addressList;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Address> getAddressList() {
return addressList;
}
public void setAddressList(List<Address> addressList) {
this.addressList = addressList;
}
}
import com.zm.config.DesensitizeType;
import com.zm.config.Desensitized;
import java.util.List;
public class Address {
private String addressInfo;
@Desensitized(type = DesensitizeType.MOBILE_PHONE)
private String telNumber;
@Desensitized
private List<Address> addressList;
public String getAddressInfo() {
return addressInfo;
}
public void setAddressInfo(String addressInfo) {
this.addressInfo = addressInfo;
}
public String getTelNumber() {
return telNumber;
}
public void setTelNumber(String telNumber) {
this.telNumber = telNumber;
}
public List<Address> getAddressList() {
return addressList;
}
public void setAddressList(List<Address> addressList) {
this.addressList = addressList;
}
}
import java.io.Serializable;
public class ApiResult<T> implements Serializable {
private T data;
private int code;
private String msg;
public static <T> ApiResult successMsg() {
return new ApiResult().setCode(200).setMsg("ok");
}
public static <T> ApiResult successMsg(Object Object) {
return new ApiResult().setCode(200).setMsg("ok").setData(Object);
}
public static <T> ApiResult errorMsg(int code, String msg) {
return new ApiResult().setCode(code).setMsg(msg);
}
public static <T> ApiResult errorMsg(String msg) {
return new ApiResult().setCode(500).setMsg(msg);
}
public T getData() {
return data;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
public ApiResult<T> setData(T data) {
this.data = data;
return this;
}
public ApiResult<T> setCode(Integer code) {
this.code = code;
return this;
}
public ApiResult<T> setMsg(String msg) {
this.msg = msg;
return this;
}
}
脱敏工具类 使用 hutool的
import cn.hutool.core.util.DesensitizedUtil;
public class DesensitizeUtils {
public static String dataMasking(DesensitizeType type, String oldValue) {
String newVal = null;
switch (type) {
case NAME:
newVal = DesensitizedUtil.chineseName(oldValue);
break;
case ID_CARD_18:
newVal = DesensitizedUtil.idCardNum(oldValue, 5, 2);
break;
case EMAIL:
break;
case MOBILE_PHONE:
newVal = DesensitizedUtil.mobilePhone(oldValue);
break;
}
return newVal;
}
}
自定义 ResponseBodyAdvice
import com.zm.controller.ApiResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Slf4j
@ControllerAdvice(basePackages = "com.zm.controller")
public class DesensitizeResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return returnType.getMethodAnnotation(DesensitizeSupport.class) != null;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
if(body instanceof ApiResult){
ApiResult apiResult = (ApiResult) body;
dealValue(apiResult.getData());
}else {
dealValue(body);
}
return body;
}
public void dealValue(Object obj){
try {
Class<?> clazz = obj.getClass();
List<Field> fieldList = getAllFields(clazz);
for (Field field : fieldList) {
Desensitized annotation = field.getAnnotation(Desensitized.class);
if (annotation == null) {
continue;
}
field.setAccessible(true);
if (field.get(obj) == null) {
continue;
}
Class<?> type = field.getType();
if (String.class == type) {
DesensitizeType annotType = annotation.type();
String oldValue = (String) field.get(obj);
String newVal = DesensitizeUtils.dataMasking(annotType, oldValue);
field.set(obj, newVal);
}
if (type == Object[].class) {
Object[] array = (Object[]) field.get(obj);
for (Object s : array) {
dealValue(s);
}
}
if (List.class.isAssignableFrom(type)) {
List<Object> list = (List) field.get(obj);
for (Object o : list) {
dealValue(o);
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
log.error("参数脱敏失败{}",e.getMessage());
}
}
public List<Field> getAllFields(Class<?> clazz) {
List<Field> fieldList = new ArrayList<>();
while (clazz != null) {
Field[] declaredFields = clazz.getDeclaredFields();
fieldList.addAll(Arrays.asList(declaredFields));
clazz = clazz.getSuperclass();
}
return fieldList;
}
}
测试类
import com.zm.bean.Address;
import com.zm.bean.UserModel;
import com.zm.config.DesensitizeSupport;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class TestController1 {
@DesensitizeSupport
@GetMapping("test1")
public ApiResult<UserModel> test1(){
return ApiResult.successMsg(this.init());
}
@DesensitizeSupport
@GetMapping("test2")
public UserModel test2(){
return this.init();
}
private UserModel init(){
UserModel userModel = new UserModel();
List<Address> addresses1 = new ArrayList<>();
Address address1 = new Address();
address1.setAddressInfo("dizhixinxi");
address1.setTelNumber("18020921508");
List<Address> addresses2 = new ArrayList<>();
Address address2 = new Address();
address2.setAddressInfo("dizhixinxi");
address2.setTelNumber("18020921508");
addresses2.add(address2);
address1.setAddressList(addresses2);
addresses1.add(address1);
userModel.setName("小明明");
userModel.setAddressList(addresses1);
return userModel;
}
}
效果