在java自定义异常中脱敏身份证,核心做法是在构造异常消息时通过正则替换将身份证号中间部分掩码化。具体实现是编写一个工具方法,使用正则表达式匹配18位或15位身份证并替换为`******`,然后在异常的构造函数中调用该方法处理原始消息。这样既能保留错误上下文,又能防止敏感信息泄露。

如何设计支持脱敏的自定义异常类
直接回答:通过继承`RuntimeException`并重写构造函数来实现。在构造函数中接收原始消息,调用脱敏工具处理后传递给父类。这样所有使用该异常的场景都会自动获得脱敏后的消息。

public class SensitiveDataException extends RuntimeException {
public SensitiveDataException(String message) {
super(DesensitizeUtil.maskIdCard(message));
}
public SensitiveDataException(String message, Throwable cause) {
super(DesensitizeUtil.maskIdCard(message), cause);
}
}
上述代码展示了最简实现。关键点是构造函数中必须调用`DesensitizeUtil.maskIdCard()`。如果原始消息包含多个身份证号,正则替换会全部处理。如果消息为空或null,需确保工具方法有防御性判断。
如何实现通用的身份证脱敏工具方法
直接回答:使用正则表达式`d{6}(d{8})(d{4})`匹配18位身份证,替换中间8位为`*`;对15位身份证使用`d{6}(d{7})(d{3})`替换中间7位。工具方法应处理边界情况如空字符串。
掌握 ES6+ 特性,包括 async/await、解构、扩展运算符、箭头函数、Promise、模块、迭代器、生成器以及函数式编程模式,编写简洁高效的 Java

public class DesensitizeUtil {
private static final Pattern ID_CARD_PATTERN =
Pattern.compile("\d{6}(\d{8})(\d{4})|\d{6}(\d{7})(\d{3})");
public static String maskIdCard(String input) {
if (input == null || input.isEmpty()) {
return input;
}
return ID_CARD_PATTERN.matcher(input).replaceAll("$1********$2");
}
}
该工具方法使用捕获组保留前后缀,仅替换中间部分。注意正则中的转义字符和分组引用。测试时应覆盖18位、15位、无身份证、多身份证等场景。实际使用时只需在异常构造处调用此静态方法即可。
当异常消息中包含非标准格式身份证时会发生什么
直接回答:当前正则只匹配标准18位和15位数字身份证。如果消息中包含带X结尾、含字母或非数字字符的“身份证”,正则不会匹配,原样保留。这是预期行为,因为非标准格式不应被误判为真实身份证。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










