@JsonSerialize
先看下jackson的@JsonSerialize注解。
@JsonSerialize是jackson提供自定義序列化方法的注解,它有個using 屬性,指定自定義序列化的執(zhí)行類;
例如:
先自定義一個序列化類
public class OptimizedBooleanSerializer extends JsonSerializer<Boolean> {
@Override
public void serialize(Boolean aBoolean, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider)
throws IOException, JsonProcessingException {
if(aBoolean){
jsonGenerator.writeNumber(1);
} else {
jsonGenerator.writeNumber(0);
}
}
}
@JsonSerialize注解的Java類示例
public class PersonVo {
public long personId = 0;
public String name ="John";
@JsonSerialize(using = OptimizedBooleanSerializer.class)
public boolean enabled = false;
}
我們知道,springMVC是通過jackson這個序列化框架,當(dāng)響應(yīng)頭的Content-Type是application/json;charset=UTF-8時,對返回的vo轉(zhuǎn)換為json對象;所以,利用jackson的注解,這樣就可以實現(xiàn)脫敏,下面我們對這個注解做一層封裝。
升級
1.自定義序列化類,每當(dāng)有需要脫敏的字段,例如,人名,郵箱,手機(jī)號等等,我們就創(chuàng)建一個這樣的類,主要是制定一種脫敏的規(guī)則。
public class EmailDesensitization extends JsonSerializer<String> {
/**
* 郵箱正則(半匹配)
*/
private static final Pattern DEFAULT_PATTERN = Pattern.compile("([A-Za-z0-9_\\-.])+@([A-Za-z0-9_\\-.])+\\.([A-Za-z]{2,4})");
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
Matcher matcher = DEFAULT_PATTERN.matcher(value);
while (matcher.find()) {
String group = matcher.group();
int l = group.lastIndexOf("@");
value = value.replace(group, group.substring(0,2) + Symbol.getSymbol(l - 2, Symbol.STAR) + group.substring(l));
}
gen.writeString(value);
}
}
2.定義脫敏注解
@JacksonAnnotationsInside 表示將注解捆綁;當(dāng)我們在字段注解@EmailDesensitize ,等價于@JsonSerialize(using = EmailDesensitization.class);
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = EmailDesensitization.class)
@Documented
public @interface EmailDesensitize {
}
Symbol類
public class Symbol {
/**
* '*'脫敏符
*/
public static final String STAR = "*";
private Symbol() {
}
/**
* 獲取符號
*
* @param number 符號個數(shù)
* @param symbol 符號
*/
public static String getSymbol(int number, String symbol) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < number; i++) {
sb.append(symbol);
}
return sb.toString();
}
}
3.vo字段加注解
public class PersonVo {
private String name;
@JsonProperty("someEmail")
@EmailDesensitize
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
4.測試
@RestController
public class TestController {
@ResponseBody
@GetMapping("/getPerson")
public PersonVo getPerson() {
PersonVo vo = new PersonVo();
vo.setName("強(qiáng)強(qiáng)");
vo.setEmail("13355782547@qq.com");
return vo;
}
}
5.結(jié)果
{"name":"強(qiáng)強(qiáng)","someEmail":"13********@qq.com"}