尊重用户隐私一直是我们在开发应用程序时应重视的问题。在当今移动互联网时代,手机号码作为个人重要信息之一,泄露可能导致隐私侵犯和骚扰问题。为了保护用户的手机号安全,我们可以借助Spring Boot框架提供的强大功能,实现手机号脱敏的有效保护,让通信更加安心无忧。
那么,如何在Spring Boot应用中实现手机号脱敏呢?正好我们在项目中有个关于用户状态的需求,结合实践下面将介绍两种简单而高效的实践方法。
方法一:数据库查询替换字符串
使用mysql SUBSTRING函数
SELECT
CONCAT(
SUBSTRING( mobile, 1, 3 ),
'****',
SUBSTRING( mobile, 8 )) AS mobile,
account_status
FROM
login_user_info
如上sql,我们将手机号的前三位与后四位截取了出来,中间的四位用****
做了替换,结果如下:
方法二:基于注解实现
1.创建枚举类
SensitiveEnum
public enum SensitiveEnum {
/**
* 手机号
*/
MOBILE;
}
2.创建字段注解
SensitiveField
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveAspect.class)
public @interface SensitiveField {
SensitiveEnum type();
}
3.创建脱敏工具类
SensitiveField
public class SensitiveUtil {
/**
* 隐藏手机号中间四位
*/
public static String sensitiveMobile(String mobile) {
return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
}
4.自定义的Jackson序列化器
SensitiveAspect
@NoArgsConstructor
@AllArgsConstructor
public class SensitiveAspect extends JsonSerializer<String> implements ContextualSerializer {
private SensitiveEnum sensitiveEnum;
@Override
public void serialize( String value, JsonGenerator gen, SerializerProvider sp) throws IOException {
if (StringUtils.isNotBlank(value) && null != sensitiveEnum) {
switch (sensitiveEnum) {
case MOBILE:
gen.writeString(SensitiveUtil.sensitiveMobile(value));
break;
//其他类型的脱敏处理
default:
gen.writeString(value);
}
}
}
@Override
public JsonSerializer<?> createContextual( SerializerProvider sp, BeanProperty bp) throws JsonMappingException {
if (bp != null) {
if (Objects.equals(bp.getType().getRawClass(), String.class)) {
SensitiveField sensitiveField = bp.getAnnotation(SensitiveField.class);
if (sensitiveField == null) {
sensitiveField = bp.getContextAnnotation(SensitiveField.class);
}
if (sensitiveField != null) {
return new SensitiveAspect(sensitiveField.type());
}
}
return sp.findValueSerializer(bp.getType(), bp);
}
return sp.findNullValueSerializer(null);
}
}
5.实体类添加注解
@Data
public class UserStatusReportVo implements Serializable {
private static final long serialVersionUID = 1L;
@SensitiveField(type = SensitiveEnum.MOBILE)
private String mobile;
/**
* 账号状态(0-注销状态 1-正常使用)
*/
private String accountStatus;
}
通过以上简单的步骤,我们成功实现了使用Spring Boot进行手机号脱敏的功能。用户的隐私得到了有效保护,同时保持了应用程序的正常。展示结果如下:
需要注意的是我们方法二采用的是自定义的Jackson序列化器,是在数据返给前端前序列化数据的时候进行转换的,如果要在导出等非前端展示的数据中使用时,我们可以使用aop对数据进行拦截操作,在给对象赋值时进行数据操作。