自定义@Sensitive对敏感字段进行脱敏处理

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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值