递归脱敏
2020-04-23 本文已影响0人
夏年城丶凌
说明
对特定类型的返回值进行深度递归处理
List<Map<String,Object>>
或Map<String,Object>
或是可以将JSON字符串转成对应的格式类型
递归说明
判断类类型是否是List,如果是List,则进入递归体,结束标志位String
脱敏核心方法
map.put(key, support.desensitize(field, keyRule));
单独写了一个脱敏工具JAR包做处理,保证基本信息(姓名、身份证、手机号等)的安全
`private static final String RESULT_TYPE_STRING = "String";
private static final String RESULT_TYPE_LIST = "List";
private static final String RESULT_TYPE_MAP = "Map";
private static DesensitizeSupport support = new DesensitizeSupport();
public static void recursiveSearch(List<Map<String,String>> keyList,Object b){
if (b == null || b.getClass() == null) {
return;
}
String classType = b.getClass().getSimpleName(); //类类型
if (RESULT_TYPE_STRING.equals(classType)){
return;
}
if (classType.contains(RESULT_TYPE_LIST)){
List list = (List) b;
for (Object x : list){
recursiveSearch(keyList,x);
}
}
if (classType.contains(RESULT_TYPE_MAP)){
Map<String,Object> map = (Map<String,Object>) b;
for(Map<String, String> keyMap : keyList){
String key = keyMap.get("key");
String keyRule = keyMap.get("keyRule");
if (map.get(key) != null){
String field = String.valueOf(map.get(key));
try {
map.put(key, support.desensitize(field, keyRule));
} catch (DesensitizeException e) {
e.printStackTrace();
}
}
}
Collection<Object> objects = map.values();
for (Object x : objects){
recursiveSearch(keyList,x);
}
}
}`
不足之处
递归的深度如果没有做限制的话,容易报OMM异常(虚拟机栈最大空间为1M),需要做递归深度的限制处理。