文档章节

自定义注解实现日志脱敏

 滑稽阿狸
发布于 2016/11/24 23:37
字数 946
阅读 115
收藏 0

第一步:定义注解

/**
 * 说明:自定义注解
 * @author T-xul3
 * @date  2016年9月9日 下午2:44:49
 */
@Target(value={ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SensitiveInfo {
    
    public SensitiveUtils.sensitiveType Type();
    
}

第二步:使用注解

/**
 * 说明:脱敏工具类
 * @author T-xul3
 * @date  2016年9月8日 下午5:44:17
 */
public  class SensitiveUtils {
    
    /**
     * 说明:脱敏枚举类
     * @author T-xul3
     * @date  2016年9月8日 下午5:44:39
     */
    public enum sensitiveType {
        
        name,idCardNum,mobilePhone,bankCard,cnapsCode,fixedPhone,defaultType;

    }
    
    /**
     * 说明:    用户名:只显示第一个,其他隐藏为星号<例子:李**>
     * @param ss
     * @return
     * 2016年9月8日 下午5:40:29
     */
    public static String name(String ss){
        if(StringUtils.isBlank(ss)){
            return "";
        }
        int length=StringUtils.length(ss);
        String newStr=StringUtils.left(ss, 1);
        return StringUtils.rightPad(newStr, length, "*");
        //return ss.replaceAll("(.)", "*");
    }
    
    /**
     * 说明:    默认全部字符串转换为* <例子:1234 ----》 **** >
     * @param strDefault 
     * @return
     * @author T-xul3
     * @date  2016年9月9日 下午2:36:55
     */
    public static String defaultType(String strDefault){
        return strDefault.replaceAll("(.)", "*");
        
    }
    /**
     * 说明:     身份证号码:显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
     * @param id
     * @return
     * 2016年9月8日 下午5:39:27
     */
    public static String idCardNum(String id) {
        if (StringUtils.isBlank(id)) {
                return "";
          }
         String num = StringUtils.right(id, 4);
         return StringUtils.leftPad(num, StringUtils.length(id), "*");
        }
    
    /**
     * 说明:    [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>
     * @param num 手机号码
     * @return
     * @author T-xul3
     * @date  2016年9月8日 下午5:47:06
     */
    public static String mobilePhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
return StringUtils.left(num,3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num,4), StringUtils.length(num), "*"), "***"));
    }
    
    /**
     * 说明:    参数类型是Integer(长度值小于11位)
     * [固定电话] 后四位,其他隐藏<例子:****1234>
     * @param num
     * @return
     * @author T-xul3
     * @date  2016年9月9日 上午10:35:23
     */
    public static String fixedPhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        int length=StringUtils.length(num);
        //从右边截取制定长度的字符串
        String right = StringUtils.right(num, 4);
        //如果参数1长度小于参数2,那么全部用*号替换
        return StringUtils.leftPad(right, length, "*");
    }

    /**
     * 说明:    [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>
     * @param cardNum 银行卡号
     * @return
     * @author T-xul3
     * @date  2016年9月8日 下午5:48:26
     */
    public static String bankCard(String cardNum) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
    }
    
    /**
     * 说明:     [公司开户银行联号] 公司开户银行联行号,显示前两位,其他用星号隐藏,每位1个星号<例子:12********>
     * @param code 公司开户银行联号
     * @return
     * @author T-xul3
     * @date  2016年9月8日 下午5:50:10
     */
    public static String cnapsCode(String code) {
        if (StringUtils.isBlank(code)) {
            return "";
        }
        return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
    }

    
    /**
     * 说明:    获取脱敏对象
     * @param object 
     * @return
     * @throws SecurityException 
     * @throws NoSuchFieldException 
     * @throws IllegalAccessException 
     * @throws IllegalArgumentException 
     * @throws Exception
     * 2016年9月8日 下午5:41:16
     */
    public static String getJavaBean(Object object) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException  {
        
        Class<? extends Object> clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        String str="";
            for (Field field : fields) {
                field.setAccessible(true);
                //获取字段上的注解
                SensitiveInfo annotation = field.getAnnotation(SensitiveInfo.class);
                //获取字段的属性名称
                String fieldName=field.getName();
                //获取字段的值并转换为String类型
                String value = fieldType(object, field, fieldName);
                //判断是否存在注解
                if(null!=annotation){
                //获取注解的具体类型
                sensitiveType Type = annotation.Type();
                //匹配注解类型
                switch(Type){
                    case name:{
                        //替换为*号,重新输出
                        String valueStr = SensitiveUtils.name(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                    case idCardNum:{
                        //替换为*号,重新输出
                        String valueStr = SensitiveUtils.idCardNum(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                    case mobilePhone:{
                        //替换为*号,重新输出
                        String valueStr = SensitiveUtils.mobilePhone(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                    case fixedPhone:{
                        //替换为*号,重新输出
                        String valueStr = SensitiveUtils.fixedPhone(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                    default:{
                        String valueStr = SensitiveUtils.defaultType(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                }
            };
            if(null==annotation){
                str+=fieldName+":"+value+",";
            }
        }
        return str;
    }

    private static String fieldType(Object object, Field field, String fieldName)
            throws NoSuchFieldException, IllegalAccessException {
        //获取字段的类型
        Class<?> fieldClazz = field.getType();
        String value="";
        //通过属性名获取私有属性字段的属性值
        Field f1 = object.getClass().getDeclaredField(fieldName);
        f1.setAccessible(true);
        //判断字段具体类型,最终将字段值全部转换为String类型。
        if(fieldClazz.equals(String.class)){
            value = (String) f1.get(object);
        }
        if(fieldClazz.equals(Integer.class)){
            Integer valueInteger = (Integer) f1.get(object);
            value=valueInteger.toString();
        }
        if(fieldClazz.equals(Long.class)){
            Long valueLong = (Long) f1.get(object);
            value=valueLong.toString();
        }
        if(fieldClazz.equals(int.class)){
            int valueLong = (int) f1.get(object);
            value=String.valueOf(valueLong);
        }
        return value;
    }
}    

 

第三步:测试

SensitiveUtils.getBean(Object) 
SensitiveUtils.注解类型(字段)

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 8
码字总数 3930
作品 0
上海
私信 提问
数据脱敏——什么是数据脱敏

  数据脱敏(Data Masking),又称数据漂白、数据去隐私化或数据变形。      百度百科对数据脱敏的定义为:指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在...

zancun
03/08
0
0
数据脱敏平台-大数据时代的隐私保护利器

什么是数据脱敏 又称数据漂白、数据去隐私化或数据变形。是对核心业务数据中敏感的信息,进行变形、转换、混淆,使得对业务数据中的身份、组织等隐私敏感信息进行去除或掩盖,以保护数据能被...

隐林
11/03
0
0
【Java进阶】利用APT优雅的实现统一日志格式

统一日志格式的几种方式 无论是搭建日志平台还是进行大数据分析,统一日志格式都是一个重要的前提条件。假设要统一成下面的日志格式, 日志格式:[{系统}|{模块}]{描述}[param1=value1$param...

English0523
01/12
0
0
Spring自定义注解简单使用四步走

在实际开发中,很多时刻我们会有记录请求日志,定时任务日志等需求,在每个方法中都编写相同的代码去记录日志显然是不合理的。 Spring已经为我们提供了面向切面编程的思想,不妨简单的使用下...

红尾巴的猪
2017/11/08
0
0
springAOP自定义注解方式实现日志管理

今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用SPRing AOP 自定义注解形式实现日志管理。废话不多说,直接开始!!! 关于配置我还是的再说一遍。 在app...

嘻哈开发者
2016/04/11
70
0

没有更多内容

加载失败,请刷新页面

加载更多

deepin中配置robot framework环境

本文永久更新地址:https://my.oschina.net/bysu/blog/2989005 【若要到岸,请摇船:开源中国 不最醉不龟归】 1.在终端中输入pip,回车,如果提示没有该命令,则先安转pip sudo apt-get inst...

不最醉不龟归
24分钟前
2
0
OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
今天
91
3
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
20
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
29
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
38
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部