springboot中基于json序列化实现数据脱敏
序列化器
import com. fasterxml. jackson. core. JsonGenerator ;
import com. fasterxml. jackson. databind. JsonSerializer ;
import com. fasterxml. jackson. databind. SerializerProvider ;
import java. io. IOException ;
import java. util. regex. Matcher ;
import java. util. regex. Pattern ;
public class SensitiveDataSerializer extends JsonSerializer < String > {
private static final Pattern MOBILE_PATTERN = Pattern . compile ( "(\\d{3})\\d{4}(\\d{4})" ) ;
private static final Pattern ID_CARD_PATTERN = Pattern . compile ( "(\\d{4})\\d{10}(\\w{4})" ) ;
private static final Pattern NAME_PATTERN = Pattern . compile ( "([\\u4e00-\\u9fa5]{1})(.*)" ) ;
private static final Pattern ADDRESS_PATTERN = Pattern . compile ( "(.*[省市区])(.*)" ) ;
private static final Pattern EMAIL_PATTERN = Pattern . compile ( "(\\w+)(\\w{3}@\\w+\\.\\w+)" ) ;
private static final Pattern BANK_CARD_PATTERN = Pattern . compile ( "(\\d{6})\\d+(\\d{4})" ) ;
@Override
public void serialize ( String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if ( value == null ) {
gen. writeNull ( ) ;
return ;
}
String result = value;
Matcher mobileMatcher = MOBILE_PATTERN. matcher ( value) ;
if ( mobileMatcher. matches ( ) ) {
result = mobileMatcher. replaceAll ( "$1****$2" ) ;
}
Matcher idCardMatcher = ID_CARD_PATTERN. matcher ( value) ;
if ( idCardMatcher. matches ( ) ) {
result = idCardMatcher. replaceAll ( "$1**********$2" ) ;
}
Matcher nameMatcher = NAME_PATTERN. matcher ( value) ;
if ( nameMatcher. matches ( ) ) {
String lastName = nameMatcher. group ( 1 ) ;
String firstName = nameMatcher. group ( 2 ) ;
result = lastName + firstName. replaceAll ( "." , "*" ) ;
}
Matcher addressMatcher = ADDRESS_PATTERN. matcher ( value) ;
if ( addressMatcher. matches ( ) ) {
String area = addressMatcher. group ( 1 ) ;
String detail = addressMatcher. group ( 2 ) ;
result = area + detail. replaceAll ( "." , "*" ) ;
}
Matcher emailMatcher = EMAIL_PATTERN. matcher ( value) ;
if ( emailMatcher. matches ( ) ) {
String username = emailMatcher. group ( 1 ) ;
String domain = emailMatcher. group ( 2 ) ;
result = username. replaceAll ( "." , "*" ) + domain;
}
Matcher bankCardMatcher = BANK_CARD_PATTERN. matcher ( value) ;
if ( bankCardMatcher. matches ( ) ) {
result = bankCardMatcher. replaceAll ( "$1****$2" ) ;
}
gen. writeString ( result) ;
}
}
实体类
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@JsonSerialize(using= SensitiveDataSerializer.class)
private String name; // 姓名
@JsonSerialize(using= SensitiveDataSerializer.class)
private String mobile; // 手机号码
@JsonSerialize(using= SensitiveDataSerializer.class)
private String idCard; // 身份证号码
@JsonSerialize(using= SensitiveDataSerializer.class)
private String address; // 地址
@JsonSerialize(using= SensitiveDataSerializer.class)
private String email; // 邮箱地址
@JsonSerialize(using= SensitiveDataSerializer.class)
private String bankCard; // 银行卡号
}
test
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/sensitive")
public class SensitiveController {
@RequestMapping("/user")
public User sensitive() {
return new User("张三三", "13800138000", "110101199001011234", "北京市朝阳区望京SOHO", "123456@qq.com", "6228480402564890018");
}
}
效果