1.通过面向切面基于注解方式进行处理
@RequestMapping("/test") @Sensitive(name={"userName"},phoneNo={"mobile"},email={"email"}) public Rsp_1 test(){ //对返回结果进行脱敏处理 }
切面类
/** * 切面类,对敏感信息进行脱敏处理 * @Author mufeng * @Date 2019-5-23 16:42 */ @Aspect @Component public class SensitiveAspect { private static Logger logger=LoggerFactory.getLogger(SensitiveAspect.class); public SensitiveAspect(){ } @Pointcut("@annotation(com.mufeng.validator.annotation.Sensitive)") public void filter(){ } /** * 对@Sensitive标记的方法进行过滤 * @param pjp * @return */ @Around("filter()") public Object afterReturn(ProceedingJoinPoint pjp){ MethodSignature signature = (MethodSignature)pjp.getSignature(); Method method = signature.getMethod(); Object result=null; try { result = pjp.proceed(); if(method.isAnnotationPresent(Sensitive.class)){ //对返回结果脱敏处理 result= SensitiveUtil.sensitiveFilter(method, result); } } catch (Throwable throwable) { logger.error("脱敏异常:"+throwable.getMessage()); } return result; } } /** * 脱敏工具类 * @Author mufeng * @Date 2019-5-23 17:46 */ public class SensitiveUtil { private static Logger logger=LoggerFactory.getLogger(SensitiveUtil.class); //通过静态map存储,多次访问都是同一资源 private static Map<String, Map<String, String>> METHOD_MAP = new HashMap(); public SensitiveUtil() { } public static Object sensitiveFilter(Method method, Object result) { String methodName = method.getDeclaringClass().getName() + "." + method.getName(); Map<String, String> map = (Map)METHOD_MAP.get(methodName); if (map == null) { //注册所有被标记的@Sensitive属性 map = register(method); } //脱敏处理 return desensitiveObject(map, result); } /** * 返回结果对象转成JsonObject,进行解析 * @param filedsMap * @param result * @return */ private static Object desensitiveObject(Map<String,String> filedsMap, Object result) { if(filedsMap.isEmpty()){ return result; }else{ Class<?> clazz = result.getClass(); JSONObject jsonObj = (JSONObject)JSONObject.toJSON(result); //解析 analysisJson(jsonObj, filedsMap); result = JSONObject.toJavaObject(jsonObj, clazz); return result; } } private static void analysisJson(Object jsonObj, Map<String,String> filedsMap) { // if(jsonObj instanceof JSONArray){ JSONArray jsonArr = (JSONArray) jsonObj; for(int i=0;i<jsonArr.size();i++){ Object obj = jsonArr.get(i); //不是JSONObject或JSONArray不进行解析 if(!(obj instanceof JSONObject)&&!(obj instanceof JSONArray)){ logger.info("JsonArray 不进行解析的第{}属性:{}",i,obj); }else{ analysisJson(obj,filedsMap); } } }else if(jsonObj instanceof JSONObject){ JSONObject jsonObject = (JSONObject) jsonObj; jsonObject.keySet().forEach(key -> { Object obj = jsonObject.get(key); //不是JSONObject或JSONArray,为String进行处理 if(!(obj instanceof JSONObject)&&!(obj instanceof JSONArray)){ if(obj instanceof String){ processDesensitizeJson(jsonObject, key, filedsMap); }else{ logger.info("JSONObject不解析属性:{}",obj); } }else{ analysisJson(obj,filedsMap); } }); }else{ logger.info("不是JSONObject和JsonArray不进行解析:{}",jsonObj); } } /** * 脱敏处理 * @param jsonObject 返回结果 * @param key 需脱敏处理字段名 * @param filedsMap 需脱敏map */ private static void processDesensitizeJson(JSONObject jsonObject, String key, Map<String,String> filedsMap) { if(filedsMap.containsKey(key)){ try { logger.info("开始脱敏处理。。。。"); //获取脱敏对应handle的方法名 String methodName = filedsMap.get(key); //实例化脱敏处理类 Class<?> clazz = Class.forName("com.mufeng.validator.util.SensitiveHandle"); //通过反射获取脱敏方法 Method method = clazz.getMethod(methodName, String.class); //脱敏返回新值 String newValue =(String) method.invoke((Object) null, (String) jsonObject.get(key)); jsonObject.put(key,newValue); } catch (Exception e) { logger.error("脱敏异常:{}",e.getMessage()); } } } private static Map<String, String> register(Method method) { Map<String, String> map = new HashMap(); Sensitive sen = (Sensitive)method.getAnnotation(Sensitive.class); if (sen != null) { //获取@Sensitive注解所有属性 Method[] methods = Sensitive.class.getMethods(); Method[] var4 = methods; int var5 = methods.length; for(int var6 = 0; var6 < var5; ++var6) { Method m = var4[var6]; try { //获取被标记属性的值 String[] keys = (String[])((String[])m.invoke(sen)); if (keys == null || keys.length == 0) { break; } String[] var9 = keys; int var10 = keys.length; for(int var11 = 0; var11 < var10; ++var11) { String s = var9[var11]; if (StringUtils.isEmpty(s)) { break; } //属性值作为key,属性名作为value map.put(s, m.getName()); } } catch (Exception var13) { logger.error(var13.getMessage()); } } METHOD_MAP.put(method.getDeclaringClass().getName() + "." + method.getName(), map); } return map; } /** * 处理类 * @Author mufeng * @Date 2019-5-24 10:26 */ public class SensitiveHandle { public SensitiveHandle() { } public static String name(String name) { if (StringUtils.isEmpty(name)) { return ""; } else { return name.length() == 1 ? name : SensitiveBean.getMaskCharWay(name, 2, name.length()); } } public static String idCardNo(String idCardNo) { if (StringUtils.isEmpty(idCardNo)) { return ""; } else { return idCardNo.length() <= 8 ? idCardNo : SensitiveBean.getMaskCharWay(idCardNo, 5, idCardNo.length() - 4); } } public static String driverLicense(String drivingLicense) { if (StringUtils.isEmpty(drivingLicense)) { return ""; } else { return drivingLicense.length() <= 8 ? drivingLicense : SensitiveBean.getMaskCharWay(drivingLicense, 5, drivingLicense.length() - 4); } } } /** * * 进行覆盖 * @Author mufeng * @Date 2019-5-24 10:33 */ public class SensitiveBean { private static final String[] cache = new String[]{"*", "**", "***", "****", "*****", "******", "*******", "********", "*********", "**********", "***********", "************", "*************", "**************", "***************", "****************"}; private static final char coverDefault = '*'; private String initialCode; private int beginIndex; private int endIndex; private char cover = '*'; public SensitiveBean() { } public SensitiveBean(String initialCode, int beginIndex, int endIndex) { this.initialCode = initialCode; this.beginIndex = beginIndex; this.endIndex = endIndex; } public SensitiveBean(String initialCode, int beginIndex, int endIndex, char cover) { this.initialCode = initialCode; this.beginIndex = beginIndex; this.endIndex = endIndex; this.cover = cover; } public static String getMaskSubWay(String initialCode, int beginIndex, int endIndex) { SensitiveBean override = new SensitiveBean(initialCode, beginIndex, endIndex); return override.getMaskSubWay(); } public static String getMaskSubWay(String initialCode, int beginIndex, int endIndex, char cover) { SensitiveBean override = new SensitiveBean(initialCode, beginIndex, endIndex, cover); return override.getMaskSubWay(); } public static String getMaskCharWay(String initialCode, int beginIndex, int endIndex, char cover) { SensitiveBean override = new SensitiveBean(initialCode, beginIndex, endIndex, cover); return override.getMaskCharWay(); } public static String getMaskCharWay(String initialCode, int beginIndex, int endIndex) { SensitiveBean override = new SensitiveBean(initialCode, beginIndex, endIndex); return override.getMaskCharWay(); } public String getMaskSubWay() { return null != this.initialCode && !"".equals(this.initialCode) && !"null".equals(this.initialCode) ? this.initialCode.substring(0, this.beginIndex - 1) + cover(this.beginIndex, this.endIndex, this.cover) + this.initialCode.substring(this.endIndex, this.initialCode.length()) : ""; } public String getMaskCharWay() { if (null != this.initialCode && !"".equals(this.initialCode) && !"null".equals(this.initialCode)) { char[] chars = this.initialCode.toCharArray(); char[] tempBegin = new char[this.beginIndex - 1]; char[] tempEnd = new char[this.initialCode.length() - this.endIndex]; int varEnd; for(varEnd = 0; varEnd < tempBegin.length; ++varEnd) { tempBegin[varEnd] = chars[varEnd]; } for(varEnd = 0; varEnd < tempEnd.length; ++varEnd) { tempEnd[varEnd] = chars[this.endIndex + varEnd]; } return new String(tempBegin) + cover(this.beginIndex, this.endIndex, this.cover) + new String(tempEnd); } else { return ""; } } private static String cover(int beginIndex, int endIndex, char cover) { if (beginIndex >= 0 && endIndex >= 0) { if (beginIndex > endIndex) { beginIndex ^= endIndex; endIndex ^= beginIndex; beginIndex ^= endIndex; } if (endIndex - beginIndex < cache.length && cover == '*') { return cache[endIndex - beginIndex]; } else { StringBuilder sb; for(sb = new StringBuilder(endIndex - beginIndex); beginIndex <= endIndex; ++beginIndex) { sb.append(cover); } return sb.toString(); } } else { return ""; } } public static String[] getCache() { return cache; } public static char getCoverDefault() { return '*'; } public String getInitialCode() { return this.initialCode; } public void setInitialCode(String initialCode) { this.initialCode = initialCode; } public int getBeginIndex() { return this.beginIndex; } public void setBeginIndex(int beginIndex) { this.beginIndex = beginIndex; } public int getEndIndex() { return this.endIndex; } public void setEndIndex(int endIndex) { this.endIndex = endIndex; } public char getCover() { return this.cover; } public void setCover(char cover) { this.cover = cover; }