利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏

@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"}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容