基于json序列化实现数据脱敏

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");
        }
        // 将脱敏后的值写入 JSON 输出
        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");
    }
}

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值