JAVA注解的字段脱敏处理
2020-12-13 02:12
标签:group 电子邮箱 cat factory 地址 人人 getname blank arraylist 有这样一个场景,系统中可以出现敏感的数据,在打印日志的时候,我们并不希望打印出现,这样,我们使用自己定义注解,来解决这个问题。 定义需要脱敏的字段规则。 声明注解: 测试: 测试结果: 使用了google 的API, 可以使用maven在添加,配置如下: JAVA注解的字段脱敏处理 标签:group 电子邮箱 cat factory 地址 人人 getname blank arraylist 原文地址:https://www.cnblogs.com/sgjyzj/p/11028461.html
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.google.gson.Gson;
import com.ucf.platform.framework.core.annotation.SensitiveInfo;
import com.ucf.platform.framework.core.log.UcfLogger;
import com.ucf.platform.framework.core.log.UcfLoggerFactory;
/**
* @Title: SensitiveInfoUtils.java
* @Copyright: Copyright (c) 2011
* @Description:
* 敏感信息屏蔽工具
*/
public final class SensitiveInfoUtils {
private final static UcfLogger logger = UcfLoggerFactory.getLogger(SensitiveInfoUtils.class);
/**
* [中文姓名] 只显示第一个汉字,其他隐藏为2个星号
*
* @param name
* @return
*/
public static String chineseName(String fullName) {
if (StringUtils.isBlank(fullName)) {
return "";
}
String name = StringUtils.left(fullName, 1);
return StringUtils.rightPad(name, StringUtils.length(fullName), "*");
}
/**
* [中文姓名] 只显示第一个汉字,其他隐藏为2个星号
*
* @param familyName
* @param givenName
* @return
*/
public static String chineseName(String familyName, String givenName) {
if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {
return "";
}
return chineseName(familyName + givenName);
}
/**
* [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。
*
* @param id
* @return
*/
public static String idCardNum(String id) {
if (StringUtils.isBlank(id)) {
return "";
}
String num = StringUtils.right(id, 4);
return StringUtils.leftPad(num, StringUtils.length(id), "*");
}
/**
* [固定电话] 后四位,其他隐藏
*
* @param num
* @return
*/
public static String fixedPhone(String num) {
if (StringUtils.isBlank(num)) {
return "";
}
return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");
}
/**
* [手机号码] 前三位,后四位,其他隐藏
*
* @param num
* @return
*/
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), "*"), "***"));
}
/**
* [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护
*
* @param address
* @param sensitiveSize
* 敏感信息长度
* @return
*/
public static String address(String address, int sensitiveSize) {
if (StringUtils.isBlank(address)) {
return "";
}
int length = StringUtils.length(address);
return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
}
/**
* [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示
*
* @param email
* @return
*/
public static String email(String email) {
if (StringUtils.isBlank(email)) {
return "";
}
int index = StringUtils.indexOf(email, "@");
if (index
*
* @param cardNum
* @return
*/
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个星号
*
* @param code
* @return
*/
public static String cnapsCode(String code) {
if (StringUtils.isBlank(code)) {
return "";
}
return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
}
/**
* 获取脱敏json串
*
* @param javaBean
* @return
*/
public static String getJson(Object javaBean) {
String json = null;
if (null != javaBean) {
Class extends Object> raw = javaBean.getClass();
try {
if (raw.isInterface())
return json;
Gson g = new Gson();
Object clone = g.fromJson(g.toJson(javaBean, javaBean.getClass()), javaBean.getClass());
Setimport java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ucf.platform.framework.core.util.SensitiveInfoUtils;
/**
* @Title: SensitiveInfo.java
* @Copyright: Copyright (c) 2015
* @Description:
* 敏感信息注解标记
*/
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SensitiveInfo {
public SensitiveInfoUtils.SensitiveType type() ;
}public class JavaBeanA {
public JavaBeanA(String name,String id){
}
@SensitiveInfo(type=SensitiveType.CHINESE_NAME)
private String name = "A先生";
private JavaBeanB b;
private Date date;
private List
public class JavaBeanB {
@SensitiveInfo(type=SensitiveType.CHINESE_NAME)
private String name = "B先生";
private JavaBeanA a;
private Set
public class SensitiveInfoUtilsTest {
/**
* [中文姓名] 只显示第一个汉字,其他隐藏为2个星号
*/
@Test
public void testChineseNameString() {
System.out.println(SensitiveInfoUtils.chineseName("李先生"));
}
/**
* [中文姓名] 只显示第一个汉字,其他隐藏为2个星号
*/
@Test
public void testChineseNameStringString() {
System.out.println(SensitiveInfoUtils.chineseName("李","雷"));
}
/**
* [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。
*/
@Test
public void testIdCardNum() {
System.out.println(SensitiveInfoUtils.idCardNum("1103541983073188711"));
}
/**
* [固定电话] 后四位,其他隐藏
*/
@Test
public void testFixedPhone() {
System.out.println(SensitiveInfoUtils.fixedPhone("01077482277"));
}
/**
* [手机号码] 前三位,后四位,其他隐藏
*/
@Test
public void testMobilePhone() {
System.out.println(SensitiveInfoUtils.mobilePhone("13777446578"));
}
/**
* [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护
*/
@Test
public void testAddress() {
System.out.println(SensitiveInfoUtils.address("北京朝阳区酒仙桥中路26号院4号楼人人大厦",8));
}
/**
* [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示
*/
@Test
public void testEmail() {
System.out.println(SensitiveInfoUtils.email("66374777@qq.com"));
}
/**
* [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号
*/
@Test
public void testBankCard() {
System.out.println(SensitiveInfoUtils.bankCard("6228480402565890018"));
}
/**
* [公司开户银行联号] 公司开户银行联行号,显示前两位,其他用星号隐藏,每位1个星号
*/
@Test
public void testCnapsCode() {
System.out.println(SensitiveInfoUtils.cnapsCode("102100029679"));
}
/**
* 获取脱敏json串
*/
@Test
public void testGetJson() {
// ThreadPoolExecutor consumeExecutor = new ThreadPoolExecutor(30, 30 + 10, 5, TimeUnit.SECONDS, new ArrayBlockingQueue
李**
李*
***************8711
*******2277
137****6578
北京朝阳区酒仙桥中路26号********
6*******@qq.com
622848*********0018
10**********
1443435915750
{"b":{"a":{"b":null,"date":null,"list":[],"map":null,"name":"A**"},"list":[],"map":{"a2":{"b":null,"date":null,"list":[],"map":null,"name":"A**"}},"name":"B**"},"date":null,"list":[{"a":{"b":null,"date":null,"list":[],"map":null,"name":"A**"},"list":[],"map":{"a2":{"b":null,"date":null,"list":[],"map":null,"name":"A**"}},"name":"B**"}],"map":{"b1":{"a":{"b":null,"date":null,"list":[],"map":null,"name":"A**"},"list":[],"map":{"a2":{"b":null,"date":null,"list":[],"map":null,"name":"A**"}},"name":"B**"}},"name":"A**"}
289
{"b":{"a":{"name":"A先生"},"list":[],"map":{"a2":{"name":"A先生"}},"name":"B先生"},"list":[{"a":{"name":"A先生"},"list":[],"map":{"a2":{"name":"A先生"}},"name":"B先生"}],"map":{"b1":{"a":{"name":"A先生"},"list":[],"map":{"a2":{"name":"A先生"}},"name":"B先生"}},"name":"A先生"}
300
说明:在需要脱敏的字段上使用定义好的注解,在具体的使用时用SensitiveInfoUtils.getJson(a1),如果不需要脱敏的输出,尽量不要打印JSON,使用对象的toString()输出。效率更高。
上一篇:Java SDK下载方法
下一篇:python 单元测试