DesensitizedUtil 是 package cn.hutool.core.util; 自带的一个脱敏工具类。
但是有时候一些脱敏规则这里没有,就需要自己自定义。
1、保留字符串最后一个字符
/**
* 脱敏通用方法:保留字符串最后一个字符
*
* @param str 字符串
*/
public static String desensitizeToLastChar(String str) {
//如果为空,返回空字符串
if (StrUtil.isBlank(str)) {
return StrUtil.EMPTY;
}
char[] chars = str.toCharArray();
StringBuilder newStr = new StringBuilder();
for (int i = 0; i < chars.length - 1; i++) {
newStr.append("*");
}
newStr.append(chars[chars.length - 1]);
return newStr.toString();
}
2、小于3个字都展示,大于等于3、小于等于6个字显示前1后1,大于6个字显示前2后2
/**
* 脱敏通用方法:小于3个字都展示,大于等于3、小于等于6个字显示前1后1,大于6个字显示前2后2
*
* @param str 字符串
*/
public static String desensitizeStringByLength(String str) {
//如果为空,返回空字符串
if (StrUtil.isBlank(str)) {
return StrUtil.EMPTY;
}
//字符串转字符数组
char[] chars = str.toCharArray();
//拼接
StringBuilder newStr = new StringBuilder();
//长度
int strLength = str.length();
//判断
if (strLength < 3) {
//如果字符串长度小于3,都展示
return str;
} else if (strLength <= 6) {
//显示前1后1
newStr.append(chars[0]);
for (int i = 1; i < chars.length - 1; i++) {
newStr.append("*");
}
newStr.append(chars[chars.length - 1]);
return newStr.toString();
} else {
//显示前2后2
newStr.append(chars[0]).append(chars[1]);
for (int i = 2; i < chars.length - 2; i++) {
newStr.append("*");
}
newStr.append(chars[chars.length - 2]).append(chars[chars.length - 1]);
return newStr.toString();
}
}
3、保留字符串最后面n个字,前面隐藏
/**
* 脱敏通用方法:保留字符串最后面n个字,前面隐藏。
*
* @param str 字符串
* @param num 只显示最后面n个字,前面隐藏
*/
public static String desensitizeToNumChar(String str, Integer num) {
//如果为空,返回空字符串
if (StrUtil.isBlank(str)) {
return StrUtil.EMPTY;
}
//字符串长度小于指定保留数,直接返回
if (str.length() <= num){
return str;
}
//字符串转字符数组
char[] chars = str.toCharArray();
//创建拼接对象
StringBuilder newStr = new StringBuilder();
for (int i = 0; i < chars.length - num; i++) {
newStr.append("*");
}
for (int i = 0; i < num; i++) {
newStr.append(chars[chars.length - num + i]);
}
return newStr.toString();
}