最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot+Hutool自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏

 更新時(shí)間:2023年10月10日 14:52:08   作者:掉發(fā)的小王  
我們?cè)陧?xiàng)目中會(huì)處理敏感數(shù)據(jù)時(shí),通常需要對(duì)這些數(shù)據(jù)進(jìn)行脫敏,本文主要使用了Springboot整合Hutool來(lái)自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏,感興趣的可以理解下

一、前言

我們?cè)陧?xiàng)目中會(huì)處理敏感數(shù)據(jù)(如手機(jī)號(hào)、身份證號(hào)、姓名、地址等)時(shí),通常需要對(duì)這些數(shù)據(jù)進(jìn)行脫敏,以確保數(shù)據(jù)隱私和安全。

我們本次使用 Hutool 庫(kù)來(lái)輕松實(shí)現(xiàn)數(shù)據(jù)脫敏,如果項(xiàng)目中不讓使用,可以自己防著hutool來(lái)寫一些工具類。

本次使用Springboot整合Hutool來(lái)自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏!

二、什么是數(shù)據(jù)脫敏

數(shù)據(jù)脫敏(Data Masking) ,也稱為數(shù)據(jù)遮蔽或數(shù)據(jù)隱藏,是一種 數(shù)據(jù)保護(hù)技術(shù) ,用于處理和存儲(chǔ)敏感數(shù)據(jù)時(shí),以減少或消除數(shù)據(jù)中的敏感信息,從而保護(hù)數(shù)據(jù)的隱私和安全。數(shù)據(jù)脫敏的主要目的是在保持?jǐn)?shù)據(jù)可用性的同時(shí),減少數(shù)據(jù)泄露和濫用的風(fēng)險(xiǎn)。

數(shù)據(jù)脫敏一般指數(shù)據(jù)庫(kù)正常存儲(chǔ),返回前端時(shí)進(jìn)行數(shù)據(jù)庫(kù)處理!

三、Hutool簡(jiǎn)介

Hutool是一個(gè)小而全的Java工具類庫(kù),通過(guò)靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語(yǔ)言般的優(yōu)雅,讓Java語(yǔ)言也可以“甜甜的”。

Hutool是項(xiàng)目中“util”包友好的替代,它節(jié)省了開(kāi)發(fā)人員對(duì)項(xiàng)目中公用類和公用工具方法的封裝時(shí)間,使開(kāi)發(fā)專注于業(yè)務(wù),同時(shí)可以最大限度的避免封裝不完善帶來(lái)的bug。

雖然Hutool可能會(huì)有一些bug,比起小編寫的還是強(qiáng)上不少的,所以選定它來(lái)!

現(xiàn)在最新版為: 5.8.16 ,我們直接使用最新的,bug會(huì)少一些,功能會(huì)完善一些!

支持的脫敏規(guī)則:

  • 用戶id
  • 中文姓名
  • 身份證號(hào)
  • 座機(jī)號(hào)
  • 手機(jī)號(hào)
  • 地址
  • 電子郵件
  • 密碼
  • 中國(guó)大陸車牌,包含普通車輛、新能源車輛
  • 銀行卡

四、實(shí)戰(zhàn)整合

1. 導(dǎo)入依賴

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

2. 自定義注解

@JsonSerialize(using = SensitiveInfoSerializer.class) 用于指定在序列化時(shí)應(yīng)該使用哪個(gè)自定義序列化器類

需要和下面的注解搭配使用 SensitiveInfoSerializer 我們自定義的序列化器才會(huì)生效

@JacksonAnnotationsInside 主要用于標(biāo)記其他自定義注解,這意味著你可以在一個(gè) Jackson 注解內(nèi)部使用其他自定義注解,以組合各種注解來(lái)實(shí)現(xiàn)更復(fù)雜的序列化和反序列化邏輯。

/**
 * @author wangzhenjun
 * @date 2023/9/11 14:15
 */
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveInfoSerializer.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Desensitization {
    DesensitizationType type() default DesensitizationType.DEFAULT;
    /**
     * 前置不需要打碼的長(zhǎng)度
     */
    int prefixLen() default 0;
    /**
     * 后置不需要打碼的長(zhǎng)度
     */
    int suffixLen() default 0;
    /**
     * 遮罩字符
     */
    String maskingChar() default "*";
}

3. 支持類型枚舉

/**
 * @author wangzhenjun
 * @date 2023/9/11 14:43
 */
public enum DesensitizationType {
    // 自定義規(guī)則
    CUSTOMIZE_RULE,
    // 默認(rèn)的
    DEFAULT,
    //用戶id
    USER_ID,
    //中文名
    CHINESE_NAME,
    //身份證號(hào)
    ID_CARD,
    //座機(jī)號(hào)
    FIXED_PHONE,
    //手機(jī)號(hào)
    MOBILE_PHONE,
    //地址
    ADDRESS,
    //電子郵件
    EMAIL,
    //密碼
    PASSWORD,
    //中國(guó)大陸車牌,包含普通車輛、新能源車輛
    CAR_LICENSE,
    //銀行卡
    BANK_CARD
}

4. 自定義序列化器

關(guān)于自定義的規(guī)則,大家可以根據(jù)自己的需求來(lái)寫工具類,我這里簡(jiǎn)單使用Hutool的工具來(lái)了!

StrUtil.replace(value, prefixLen, suffixLen, maskingChar) StrUtil.hide(value, prefixLen, suffixLen)

createContextual 方法首先在序列化過(guò)程開(kāi)始時(shí)被調(diào)用,返回的序列化器實(shí)例將用于后續(xù)的序列化過(guò)程。

serialize 方法責(zé)實(shí)際的序列化邏輯,將字段的值轉(zhuǎn)換為JSON,并可以在其中執(zhí)行自定義的脫敏邏輯。

/**
 * 數(shù)據(jù)脫敏序列化器
 *
 * @author wangzhenjun
 * @date 2023/9/11 14:16
 */
public class SensitiveInfoSerializer extends JsonSerializer<String> implements ContextualSerializer {
    private boolean useMasking = false;
    private DesensitizationType type;
    private int prefixLen;
    private int suffixLen;
    private String maskingChar;
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (useMasking && value != null) {
            switch (type) {
                case MOBILE_PHONE:
                    gen.writeString(DesensitizedUtil.mobilePhone(value));
                    break;
                case ID_CARD:
                    gen.writeString(DesensitizedUtil.idCardNum(value, prefixLen, suffixLen));
                    break;
                case CUSTOMIZE_RULE:
//                    gen.writeString(StrUtil.replace(value, prefixLen, suffixLen, maskingChar));
                    gen.writeString(StrUtil.hide(value, prefixLen, suffixLen));
                    break;
                case CHINESE_NAME:
                    gen.writeString(DesensitizedUtil.chineseName(value));
                    break;
                case DEFAULT:
                    gen.writeString(value);
                default:
                    gen.writeString(value);
            }
        } else {
            gen.writeObject(value);
        }
    }
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
        if (property != null) {
            Desensitization desensitization = property.getAnnotation(Desensitization.class);
            if (desensitization != null) {
                this.type = desensitization.type();
                this.prefixLen = desensitization.prefixLen();
                this.suffixLen = desensitization.suffixLen();
                this.maskingChar = desensitization.maskingChar();
                useMasking = true;
            }
        }
        return this;
    }
}

5. 實(shí)體類應(yīng)用

/**
 * @author wangzhenjun
 * @date 2023/9/12 9:15
 */
@Data
public class User {
    @Desensitization(type = DesensitizationType.ID_CARD,prefixLen = 6,suffixLen = 16)
    private String cardId;
    @Desensitization(type = DesensitizationType.CHINESE_NAME)
    private String name;
    @Desensitization(type = DesensitizationType.MOBILE_PHONE)
    private String phone;
    @Desensitization(type = DesensitizationType.CUSTOMIZE_RULE,prefixLen = 3,suffixLen = 6)
    private String info;
}

6. 測(cè)試

@GetMapping("/getUser")
public Result getUser(){
    User user = new User();
    user.setCardId("372911111111111111");
    user.setPhone("15822229999");
    user.setName("趙飛燕");
    user.setInfo("這是機(jī)密文件,該打碼打碼");
    return Result.success(user);
}

完美脫敏,此次應(yīng)該有掌聲!

五、總結(jié)

本文通過(guò)Spring Boot與Hutool庫(kù)的結(jié)合使用自定義注解,提供了一個(gè)簡(jiǎn)單而強(qiáng)大的方式來(lái)實(shí)現(xiàn)數(shù)據(jù)脫敏。希望能幫助到你,成功地實(shí)現(xiàn)數(shù)據(jù)脫敏功能,并提高應(yīng)用程序的安全性。

本次例子脫敏選項(xiàng)沒(méi)有演示全,大家可以自行補(bǔ)充完成,成為你們需要的數(shù)據(jù)脫敏策略,從而完美的處理用戶數(shù)據(jù)脫敏問(wèn)題!

可以試著使用AOP來(lái)完成脫敏,有興趣的可以試一下哈!

以上就是Springboot+Hutool自定義注解實(shí)現(xiàn)數(shù)據(jù)脫敏的詳細(xì)內(nèi)容,更多關(guān)于Springboot Hutool數(shù)據(jù)脫敏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • DUBBO 日志過(guò)濾器,輸出dubbo 接口調(diào)用入?yún)?、出參等信?最新推薦)

    DUBBO 日志過(guò)濾器,輸出dubbo 接口調(diào)用入?yún)ⅰ⒊鰠⒌刃畔?最新推薦)

    這篇文章主要介紹了DUBBO 日志過(guò)濾器,輸出dubbo 接口調(diào)用入?yún)?、出參等信?首先自定義一個(gè)過(guò)濾器?DubboLoggerFilter.java,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • SpringCloud中使用webclient(get和post)請(qǐng)求微服務(wù)接口數(shù)據(jù)

    SpringCloud中使用webclient(get和post)請(qǐng)求微服務(wù)接口數(shù)據(jù)

    在SpringCloud項(xiàng)目中使用WebClient調(diào)用微服務(wù)時(shí),涉及配置WebClient、發(fā)起get和post請(qǐng)求等操作,如請(qǐng)求頭設(shè)置、服務(wù)地址配置、數(shù)據(jù)轉(zhuǎn)換處理、異常處理等,避免在循環(huán)中使用WebClient請(qǐng)求、路徑設(shè)置細(xì)節(jié)以及數(shù)據(jù)返回處理技巧,本文旨在幫助理解和應(yīng)用WebClient進(jìn)行微服務(wù)調(diào)用
    2024-10-10
  • 一文詳解Java中的JSON數(shù)據(jù)處理指南

    一文詳解Java中的JSON數(shù)據(jù)處理指南

    JSON作為一種輕量級(jí)的數(shù)據(jù)交換格式,在Web服務(wù)和應(yīng)用程序之間廣泛使用,本文詳細(xì)介紹了在Java中解析和操作JSON數(shù)據(jù)的步驟,包括導(dǎo)入庫(kù)、創(chuàng)建JSON對(duì)象和數(shù)組、讀取數(shù)據(jù)、創(chuàng)建和序列化JSON對(duì)象,以及錯(cuò)誤處理等,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • 說(shuō)說(shuō)@ModelAttribute在父類和子類中的執(zhí)行順序

    說(shuō)說(shuō)@ModelAttribute在父類和子類中的執(zhí)行順序

    這篇文章主要介紹了@ModelAttribute在父類和子類中的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringMVC中日期格式的轉(zhuǎn)換

    SpringMVC中日期格式的轉(zhuǎn)換

    本文主要介紹了SpringMVC中日期格式轉(zhuǎn)換的相關(guān)知識(shí):用來(lái)解決日期提交轉(zhuǎn)換異常的問(wèn)題。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 配置SpringBoot方便的切換jar和war的方法示例

    配置SpringBoot方便的切換jar和war的方法示例

    這篇文章主要介紹了配置SpringBoot方便的切換jar和war的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • IDEA2020 1.1中Plugins加載不出來(lái)的問(wèn)題及解決方法

    IDEA2020 1.1中Plugins加載不出來(lái)的問(wèn)題及解決方法

    這篇文章主要介紹了IDEA2020 1.1中Plugins加載不出來(lái)的問(wèn)題,本文還給大家提到了IDEA 2020.1.1 找不到程序包和符號(hào)的問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2020-06-06
  • Java實(shí)現(xiàn)讀取CSV文件數(shù)據(jù)內(nèi)容(含逗號(hào)處理)

    Java實(shí)現(xiàn)讀取CSV文件數(shù)據(jù)內(nèi)容(含逗號(hào)處理)

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)讀取CSV文件數(shù)據(jù)內(nèi)容,包含了逗號(hào)處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-07-07
  • Java POI實(shí)現(xiàn)將導(dǎo)入Excel文件的示例代碼

    Java POI實(shí)現(xiàn)將導(dǎo)入Excel文件的示例代碼

    這篇文章主要介紹了Java POI實(shí)現(xiàn)將導(dǎo)入Excel文件的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Mybatis-plus的service通用接口解讀

    Mybatis-plus的service通用接口解讀

    這篇文章主要介紹了Mybatis-plus的service通用接口解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

揭阳市| 安化县| 叶城县| 南城县| 泌阳县| 大姚县| 三江| 云霄县| 平舆县| 四子王旗| 浙江省| 乾安县| 马边| 扶沟县| 大新县| 金昌市| 永靖县| 禄丰县| 文水县| 武冈市| 娱乐| 五华县| 深水埗区| 二连浩特市| 乌审旗| 临颍县| 淮滨县| 江北区| 皋兰县| 航空| 合川市| 绥江县| 普兰县| 乌兰察布市| 福海县| 辽中县| 于都县| 云阳县| 临颍县| 丰镇市| 山阳县|