package io.lgxkdream.test2;import org.apache.commons.lang3.StringUtils;/*** @title: MaskUtils* @description: 掩码工具类* @Copyright: Copyright (c) 2018* @Company: lgxkdream.github.io* @author gang.li* @version 1.0.0* @since 2018年3月19日 上午10:59:57*/
public class MaskUtils {public static String maskCellphone(String cellphoneNo) {if ((cellphoneNo == null) || (cellphoneNo.trim().length() != 11)) {return cellphoneNo;}return cellphoneNo.substring(0, 3) + "****" + cellphoneNo.substring(cellphoneNo.length() - 4);}public static String maskEmail(String email) {if (StringUtils.isBlank(email)) {return "";}int index = StringUtils.indexOf(email, "@");if (index <= 1)return email;elsereturn StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));}private static String maskCardNo(String cardNo) {if ((cardNo == null) || (cardNo.trim().length() <= 8)) {return cardNo;}cardNo = cardNo.trim();int length = cardNo.length();String firstFourNo = cardNo.substring(0, 4);String lastFourNo = cardNo.substring(length - 4);String mask = "";for (int i = 0; i < length - 8; i++) {mask = mask + "*";}return firstFourNo + mask + lastFourNo;}public static String maskIDCardNo(String idCardNo) {return maskCardNo(idCardNo);}public static String maskBankCardNo(String bankCardNo) {return maskCardNo(bankCardNo);}}
package io.lgxkdream.test2;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @title: SensitiveField* @description: 掩码注解* @Copyright: Copyright (c) 2018* @Company: lgxkdream.github.io* @author gang.li* @version 1.0.0* @since 2018年3月19日 上午11:01:45*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SensitiveField {SensitiveTypeEnum value() default SensitiveTypeEnum.IDCARD;enum SensitiveTypeEnum {IDCARD,BANKCARD,MOBILE,EMAIL,CVV;}}
package io.lgxkdream.test2;import java.lang.reflect.Field;import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;/*** @title: SensitiveReflectionToStringBuilder* @description: 重写用于toString的ReflectionToStringBuilder* @Copyright: Copyright (c) 2018* @Company: lgxkdream.github.io* @author gang.li* @version 1.0.0* @since 2018年3月19日 上午11:06:20*/
public class SensitiveReflectionToStringBuilder extends ReflectionToStringBuilder {public SensitiveReflectionToStringBuilder(Object object, ToStringStyle style) {super(object, style);}@Overrideprotected Object getValue(Field field) throws IllegalArgumentException, IllegalAccessException {if (field.getType() == String.class && field.isAnnotationPresent(SensitiveField.class)) {String v = (String) field.get(this.getObject());switch (field.getAnnotation(SensitiveField.class).value()) {case IDCARD:return MaskUtils.maskIDCardNo(v);case BANKCARD:return MaskUtils.maskBankCardNo(v);case MOBILE:return MaskUtils.maskCellphone(v);case EMAIL:return MaskUtils.maskEmail(v);case CVV:return v == null ? null : "***";default:return v;}}return field.get(this.getObject());}}
package io.lgxkdream.test2;import org.apache.commons.lang3.builder.ToStringStyle;import io.lgxkdream.test2.SensitiveField.SensitiveTypeEnum;/*** @title: MyEntity* @description: 测试实体* @Copyright: Copyright (c) 2018* @Company: lgxkdream.github.io* @author gang.li* @version 1.0.0* @since 2018年3月19日 上午11:21:04*/
public class MyEntity {/*** 证件号*/@SensitiveFieldprivate String idNo;/*** 手机号*/@SensitiveField(SensitiveTypeEnum.MOBILE)private String mobile;/*** 姓名*/private String name;/*** 邮箱*/@SensitiveField(SensitiveTypeEnum.EMAIL)private String email;public String getIdNo() {return idNo;}public void setIdNo(String idNo) {this.idNo = idNo;}public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return new SensitiveReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();}}
package io.lgxkdream.test2;/*** @title: MyTest* @description: 测试类* @Copyright: Copyright (c) 2018* @Company: lgxkdream.github.io* @author gang.li* @version 1.0.0* @since 2018年3月19日 上午11:21:22*/
public class MyTest {public static void main(String[] args) {MyEntity entity = new MyEntity();entity.setIdNo("220222196309129847");entity.setMobile("15764132696");entity.setName("张三");entity.setEmail("2392374239@qq.com");System.out.println(entity.toString());// 测试结果:MyEntity[idNo=2202**********9847,mobile=157****2696,name=张三,email=2*********@qq.com]}}

基于注解的字段脱敏处理相关推荐

  1. 数据脱敏——基于Java自定义注解实现日志字段脱敏

    上文说了数据过敏主要有两个思路:第一个就是在序列化实体之前先把需要脱敏的字段进行处理,之后正常序列化:第二个就是在实体序列化的时候,对要脱敏的字段进行处理. 脱敏实现思路 这里探讨第一种方法,用基于自 ...

  2. 基于注解的 IOC 配置

    基于注解的 IOC 配置 学习基于注解的 IoC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样 的,都是要降低程序间的耦合.只是配置的形式不一样. 关于实际的开发中 ...

  3. 自定义注解实现日志脱敏

    2019独角兽企业重金招聘Python工程师标准>>> 第一步:定义注解 /**  * 说明:自定义注解  * @author T-xul3  * @date  2016年9月9日 ...

  4. MyBatis基于注解的使用

    Mybtis注解 增加接口CategoryMapper ,并在接口中声明的方法上,加上注解 增加对CategoryMapper 的映射: <mappers> //com.shop.mapp ...

  5. Spring MVC-04循序渐进之基于注解的控制器

    概述 Spring MVC注解类型 Controller注解类型 RequestMapping注解类型 value属性 其他属性 编写请求处理方法 应用基于注解的控制器 目录结构 配置文件 Contr ...

  6. 使用基于注解的mybatis时,利用反射和注解生成sql语句

    在开发时遇到一个问题,在使用基于注解的mybatis插入一个对象到mysql时,在写sql语句时需要列出对象的所有属性,所以在插入一个拥有10个以上属性的对象时sql语句就会变得很长,写起来也很不方便 ...

  7. Mybatis:基于注解形式,传入List,返回List实体

    1)现在的需求是: 传入一个List<String>,返回查询到的List<Entity> 基于注解形式,我们采用in语句筛选. 2)现在的需求是: 传入一个List<S ...

  8. 从源码深处体验Spring核心技术--基于注解的IOC初始化

    Annotation 的前世今生 从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特 ...

  9. Spring5参考指南:基于注解的容器配置

    文章目录 @Required @Autowired @primary @Qualifier 泛型 @Resource @PostConstruct和@PreDestroy Spring的容器配置可以有 ...

最新文章

  1. Fedora26 tftp-server设置
  2. php将数字转化为中文大写人民币格式
  3. mysql 创建初始化帐号_MySQL创建SCOTT用户及初始化数据
  4. 自然语言处理常用标识符<UNK>,<PAD>,<SOS>,<EOS>等
  5. 【论文写作】课程指导平台的开发中系统部分代码如何写
  6. 稳健性估计—— M 估计
  7. IDEA:Windows 下载安装 IDEA 详细教程
  8. miniC语言编译器设计与实现(编译原理实验课程)
  9. java 实现pdf 转图片_java实现PDF转图片的方法
  10. 【转】贴片晶振挖空敷铜
  11. 在CTeX上编码论文《杂谈勾股定理》及论文式样
  12. 听老外吐槽框架设计,Why I Hate Frameworks?
  13. 【安卓USB开发】让手机与物联网设备鹊桥相会
  14. 多维数组变成一维数组
  15. Android测试能不能用monk,使用Monkey对apk做稳定性测试
  16. 咸鱼ZTMR实例—加速传感器
  17. AtCoder Beginner Contest 272「A」「B」「C」「D bfs」「E 思维」
  18. 杜克大学的陈怡然教授讲述:我为什么回学校而不去公司的理由,刘知远老师评论导师又在骗我读博...
  19. 【buaa机试题】机场登机口调整
  20. PhysX3.4 编译记录

热门文章

  1. c语言代码可以python运行吗_c语言如何运行python脚本
  2. python点击按钮创建进程_python-创建进程的三种方式
  3. vue 页面切换动画_Flutter Hero动画让你的APP页面切换充满动效 不一样的体验 不一样的细节处理...
  4. python识别图片上的文字_Python如何识别图片中的文字 【转】
  5. Kamailio 简介
  6. 应用层的信令控制协议 SIP
  7. pycharm使用_后端开发使用pycharm的技巧
  8. redis 多线程_唬人的Redis多线程,也就那么回事
  9. 【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)
  10. ASP.NET MVC 入门7、Hellper与数据的提交与绑定