diff --git a/CHANGELOG.md b/CHANGELOG.md index e84ddecec..18d1c1503 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * 【extra 】 ServletUtil遵循rfc 3986优化(issue#I6ALAO@Gitee) * 【http 】 HttpUtil.decodeParams增加isFormUrlEncoded重载(pr#918@Gitee) * 【db 】 AbstractDb添加返回类型为PageResult的page重载方法(pr#916@Gitee) +* 【core 】 DesensitizedUtil增加对IPv4和IPv6支持(issue#I6ABCS@Gitee) ### 🐞Bug修复 * 【core 】 修复HexUtil.isHexNumber()对"-"的判断问题(issue#2857@Github) diff --git a/hutool-cache/src/test/java/cn/hutool/cache/CacheTest.java b/hutool-cache/src/test/java/cn/hutool/cache/CacheTest.java index 1509cd56d..5bfc91c40 100755 --- a/hutool-cache/src/test/java/cn/hutool/cache/CacheTest.java +++ b/hutool-cache/src/test/java/cn/hutool/cache/CacheTest.java @@ -61,6 +61,13 @@ public class CacheTest { Assert.assertNull(value3); } + @Test + public void lfuCacheTest2(){ + Cache lfuCache = CacheUtil.newLFUCache(3); + final String s = lfuCache.get(null); + Assert.assertNull(s); + } + @Test public void lruCacheTest(){ Cache lruCache = CacheUtil.newLRUCache(3); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/DesensitizedUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/DesensitizedUtil.java index 24d2bf800..97647f272 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/DesensitizedUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/DesensitizedUtil.java @@ -27,41 +27,74 @@ public class DesensitizedUtil { * @author dazer and neusoft and qiaomu */ public enum DesensitizedType { - //用户id + /** + * 用户id + */ USER_ID, - //中文名 + /** + * 中文名 + */ CHINESE_NAME, - //身份证号 + /** + * 身份证号 + */ ID_CARD, - //座机号 + /** + * 座机号 + */ FIXED_PHONE, - //手机号 + /** + * 手机号 + */ MOBILE_PHONE, - //地址 + /** + * 地址 + */ ADDRESS, - //电子邮件 + /** + * 电子邮件 + */ EMAIL, - //密码 + /** + * 密码 + */ PASSWORD, - //中国大陆车牌,包含普通车辆、新能源车辆 + /** + * 中国大陆车牌,包含普通车辆、新能源车辆 + */ CAR_LICENSE, - //银行卡 - BANK_CARD + /** + * 银行卡 + */ + BANK_CARD, + /** + * IPv4地址 + */ + IPV4, + /** + * IPv6地址 + */ + IPV6, + /** + * 定义了一个first_mask的规则,只显示第一个字符。 + */ + FIRST_MASK } /** * 脱敏,使用默认的脱敏策略 *
-	 * DesensitizedUtil.desensitized("100", DesensitizedUtils.DesensitizedType.USER_ID)) =  "0"
-	 * DesensitizedUtil.desensitized("段正淳", DesensitizedUtils.DesensitizedType.CHINESE_NAME)) = "段**"
-	 * DesensitizedUtil.desensitized("51343620000320711X", DesensitizedUtils.DesensitizedType.ID_CARD)) = "5***************1X"
-	 * DesensitizedUtil.desensitized("09157518479", DesensitizedUtils.DesensitizedType.FIXED_PHONE)) = "0915*****79"
-	 * DesensitizedUtil.desensitized("18049531999", DesensitizedUtils.DesensitizedType.MOBILE_PHONE)) = "180****1999"
-	 * DesensitizedUtil.desensitized("北京市海淀区马连洼街道289号", DesensitizedUtils.DesensitizedType.ADDRESS)) = "北京市海淀区马********"
-	 * DesensitizedUtil.desensitized("duandazhi-jack@gmail.com.cn", DesensitizedUtils.DesensitizedType.EMAIL)) = "d*************@gmail.com.cn"
-	 * DesensitizedUtil.desensitized("1234567890", DesensitizedUtils.DesensitizedType.PASSWORD)) = "**********"
-	 * DesensitizedUtil.desensitized("苏D40000", DesensitizedUtils.DesensitizedType.CAR_LICENSE)) = "苏D4***0"
-	 * DesensitizedUtil.desensitized("11011111222233333256", DesensitizedUtils.DesensitizedType.BANK_CARD)) = "1101 **** **** **** 3256"
+	 * DesensitizedUtil.desensitized("100", DesensitizedUtil.DesensitizedType.USER_ID)) =  "0"
+	 * DesensitizedUtil.desensitized("段正淳", DesensitizedUtil.DesensitizedType.CHINESE_NAME)) = "段**"
+	 * DesensitizedUtil.desensitized("51343620000320711X", DesensitizedUtil.DesensitizedType.ID_CARD)) = "5***************1X"
+	 * DesensitizedUtil.desensitized("09157518479", DesensitizedUtil.DesensitizedType.FIXED_PHONE)) = "0915*****79"
+	 * DesensitizedUtil.desensitized("18049531999", DesensitizedUtil.DesensitizedType.MOBILE_PHONE)) = "180****1999"
+	 * DesensitizedUtil.desensitized("北京市海淀区马连洼街道289号", DesensitizedUtil.DesensitizedType.ADDRESS)) = "北京市海淀区马********"
+	 * DesensitizedUtil.desensitized("duandazhi-jack@gmail.com.cn", DesensitizedUtil.DesensitizedType.EMAIL)) = "d*************@gmail.com.cn"
+	 * DesensitizedUtil.desensitized("1234567890", DesensitizedUtil.DesensitizedType.PASSWORD)) = "**********"
+	 * DesensitizedUtil.desensitized("苏D40000", DesensitizedUtil.DesensitizedType.CAR_LICENSE)) = "苏D4***0"
+	 * DesensitizedUtil.desensitized("11011111222233333256", DesensitizedUtil.DesensitizedType.BANK_CARD)) = "1101 **** **** **** 3256"
+	 * DesensitizedUtil.desensitized("192.168.1.1", DesensitizedUtil.DesensitizedType.IPV4)) = "192.*.*.*"
 	 * 
* * @param str 字符串 @@ -77,34 +110,43 @@ public class DesensitizedUtil { String newStr = String.valueOf(str); switch (desensitizedType) { case USER_ID: - newStr = String.valueOf(DesensitizedUtil.userId()); + newStr = String.valueOf(userId()); break; case CHINESE_NAME: - newStr = DesensitizedUtil.chineseName(String.valueOf(str)); + newStr = chineseName(String.valueOf(str)); break; case ID_CARD: - newStr = DesensitizedUtil.idCardNum(String.valueOf(str), 1, 2); + newStr = idCardNum(String.valueOf(str), 1, 2); break; case FIXED_PHONE: - newStr = DesensitizedUtil.fixedPhone(String.valueOf(str)); + newStr = fixedPhone(String.valueOf(str)); break; case MOBILE_PHONE: - newStr = DesensitizedUtil.mobilePhone(String.valueOf(str)); + newStr = mobilePhone(String.valueOf(str)); break; case ADDRESS: - newStr = DesensitizedUtil.address(String.valueOf(str), 8); + newStr = address(String.valueOf(str), 8); break; case EMAIL: - newStr = DesensitizedUtil.email(String.valueOf(str)); + newStr = email(String.valueOf(str)); break; case PASSWORD: - newStr = DesensitizedUtil.password(String.valueOf(str)); + newStr = password(String.valueOf(str)); break; case CAR_LICENSE: - newStr = DesensitizedUtil.carLicense(String.valueOf(str)); + newStr = carLicense(String.valueOf(str)); break; case BANK_CARD: - newStr = DesensitizedUtil.bankCard(String.valueOf(str)); + newStr = bankCard(String.valueOf(str)); + break; + case IPV4: + newStr = ipv4(String.valueOf(str)); + break; + case IPV6: + newStr = ipv6(String.valueOf(str)); + break; + case FIRST_MASK: + newStr = firstMask(String.valueOf(str)); break; default: } @@ -120,6 +162,20 @@ public class DesensitizedUtil { return 0L; } + /** + * 定义了一个first_mask的规则,只显示第一个字符。
+ * 脱敏前:123456789;脱敏后:1********。 + * + * @param str 字符串 + * @return 脱敏后的字符串 + */ + public static String firstMask(String str) { + if (StrUtil.isBlank(str)) { + return StrUtil.EMPTY; + } + return StrUtil.hide(str, 1, str.length()); + } + /** * 【中文姓名】只显示第一个汉字,其他隐藏为2个星号,比如:李** * @@ -127,10 +183,7 @@ public class DesensitizedUtil { * @return 脱敏后的姓名 */ public static String chineseName(String fullName) { - if (StrUtil.isBlank(fullName)) { - return StrUtil.EMPTY; - } - return StrUtil.hide(fullName, 1, fullName.length()); + return firstMask(fullName); } /** @@ -284,4 +337,24 @@ public class DesensitizedUtil { buf.append(CharUtil.SPACE).append(bankCardNo, length - 4, length); return buf.toString(); } + + /** + * IPv4脱敏,如:脱敏前:192.0.2.1;脱敏后:192.*.*.*。 + * + * @param ipv4 IPv4地址 + * @return 脱敏后的地址 + */ + public static String ipv4(String ipv4) { + return StrUtil.subBefore(ipv4, '.', false) + ".*.*.*"; + } + + /** + * IPv4脱敏,如:脱敏前:2001:0db8:86a3:08d3:1319:8a2e:0370:7344;脱敏后:2001:*:*:*:*:*:*:* + * + * @param ipv6 IPv4地址 + * @return 脱敏后的地址 + */ + public static String ipv6(String ipv6) { + return StrUtil.subBefore(ipv6, ':', false) + ":*:*:*:*:*:*:*"; + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/DesensitizedUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/DesensitizedUtilTest.java index 2bd7e0b42..0441dc3e6 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/DesensitizedUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/DesensitizedUtilTest.java @@ -32,6 +32,8 @@ public class DesensitizedUtilTest { Assert.assertEquals("**********", DesensitizedUtil.desensitized("1234567890", DesensitizedUtil.DesensitizedType.PASSWORD)); Assert.assertEquals("1101 **** **** **** 3256", DesensitizedUtil.desensitized("11011111222233333256", DesensitizedUtil.DesensitizedType.BANK_CARD)); Assert.assertEquals("6227 **** **** *** 5123", DesensitizedUtil.desensitized("6227880100100105123", DesensitizedUtil.DesensitizedType.BANK_CARD)); + Assert.assertEquals("192.*.*.*", DesensitizedUtil.desensitized("192.168.1.1", DesensitizedUtil.DesensitizedType.IPV4)); + Assert.assertEquals("2001:*:*:*:*:*:*:*", DesensitizedUtil.desensitized("2001:0db8:86a3:08d3:1319:8a2e:0370:7344", DesensitizedUtil.DesensitizedType.IPV6)); } @Test