程序员

递归脱敏

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),需要做递归深度的限制处理。

上一篇下一篇

猜你喜欢

热点阅读