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, //身份证 18
EMAIL,//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");
}
/**
* 请求成功回调
* @param Object 对象参数
*/
public static <T> ApiResult successMsg(Object Object) {
return new ApiResult().setCode(200).setMsg("ok").setData(Object);
}
/**
* 请求失败回调
* @param code 状态码
* @param msg 描述信息
*/
public static <T> ApiResult errorMsg(int code, String msg) {
return new ApiResult().setCode(code).setMsg(msg);
}
/**
* 请求失败回调
* @param 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;
}
/**
* @param body
* @param returnType
* @param selectedContentType
* @param selectedConverterType
* @param request
* @param response
* @return
*/
@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());
}
}
/**
* 获取所有的字段(包括父类的)
*
* @param clazz
* @return
*/
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;
}
}
效果
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/133910.html