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

SpringBoot3使用?自定義注解+Jackson實(shí)現(xiàn)接口數(shù)據(jù)脫敏的步驟

 更新時(shí)間:2024年03月26日 10:38:19   作者:蒾酒  
本文介紹了一種以優(yōu)雅的方式實(shí)現(xiàn)對(duì)接口返回的敏感數(shù)據(jù),如手機(jī)號(hào)、郵箱、身份證等信息的脫敏處理,這種方法也是企業(yè)常用方法,話不多說(shuō)我們一起來(lái)看一下吧

寫在前面

本文介紹了springboot開發(fā)后端服務(wù)中,接口數(shù)據(jù)脫敏優(yōu)雅的設(shè)計(jì)與實(shí)現(xiàn),堅(jiān)持看完相信對(duì)你有幫助。

內(nèi)容簡(jiǎn)介

本文介紹了一種以優(yōu)雅的方式實(shí)現(xiàn)對(duì)接口返回的敏感數(shù)據(jù),如手機(jī)號(hào)、郵箱、身份證等信息的脫敏處理。這種方法也是企業(yè)常用方法。話不多說(shuō)我們一起來(lái)看一下吧。

效果展示:

實(shí)現(xiàn)思路

  • 自定義一個(gè)脫敏注解用于標(biāo)記需要脫敏的字段,并且在注解中指定脫敏策略屬性。
  • 自定義脫敏策略枚舉類,用于維護(hù)手機(jī)號(hào)、郵箱、身份證等信息的脫敏處理方式。
  • 自定義脫敏 JSON 序列化器,在該序列化器中找到帶有該注解的字段,根據(jù)注解中指定的脫敏策略,在序列化過程中將數(shù)據(jù)進(jìn)行脫敏處理并輸出到 JSON 中。

實(shí)現(xiàn)步驟

1.自定義脫敏注解

 
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.mijiu.commom.custom.serializable.DesensitizationJsonSerializable;
import com.mijiu.commom.enumerate.DesensitizationStrategyEnum;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/**
 * @author mijiupro
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizationJsonSerializable.class)
public @interface Desensitization {
    DesensitizationStrategyEnum desensitizationStrategy();//這是自定義的脫敏策略枚舉類型,用于指定脫敏策略,獲取對(duì)應(yīng)脫敏處理方法
 
}

2.編寫脫敏策略枚舉類

脫敏的本質(zhì)其實(shí)就是個(gè)字符串的替換,我們?cè)诿撁舨呗悦杜e類中通過定義函數(shù)接口,維護(hù)多種類型脫敏策略對(duì)應(yīng)的字符串替換方法。這樣做可以保證可維護(hù)性可擴(kuò)展性。

import lombok.Getter;
 
import java.util.function.Function;
 
 
/**
 * 脫敏策略枚舉類,維護(hù)對(duì)不同類型信息的脫敏處理方式
 * @author mijiupro
 */
@Getter
public enum DesensitizationStrategyEnum {
 
    // 手機(jī)號(hào)脫敏策略,保留前三位和后四位
    PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
 
    // 郵箱脫敏策略,保留郵箱用戶名第一個(gè)字符和@符號(hào)前后部分
    EMAIL(s -> s.replaceAll("(\\w)[^@]*(@\\w+\\.\\w+)", "$1****$2")),
 
    // 身份證號(hào)脫敏策略,保留前四位和后四位
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1*****$2")),
 
    // 地址脫敏策略,保留省市信息,其余部分脫敏為**
    ADDRESS(s -> s.replaceAll("([\\u4e00-\\u9fa5]{2})[\\u4e00-\\u9fa5]+", "$1**")),
 
    // 銀行卡號(hào)脫敏策略,保留前四位和后三位
    BANK_CARD(s -> s.replaceAll("(\\d{4})\\d{8,12}(\\d{3})", "$1************$2")),
 
    // 姓名脫敏策略,保留姓氏第一個(gè)字符,其余部分脫敏為**
    NAME(s -> s.charAt(0) + "**"),
 
    // 密碼脫敏策略,統(tǒng)一顯示為******
    PASSWORD(s -> "******");
 
    private final Function<String, String> desensitization;
 
    DesensitizationStrategyEnum(Function<String, String> desensitization) {
        this.desensitization = desensitization;
    }
 
}

3.編寫JSON序列化實(shí)現(xiàn)

需要清楚

  • 平時(shí)接口返回的數(shù)據(jù)結(jié)構(gòu)直接都是交給默認(rèn)的序列化器把對(duì)象轉(zhuǎn)成json的。
  • 實(shí)現(xiàn)脫敏的本質(zhì)就是在這前面添加了一段邏輯,找到帶有脫敏注解的屬性然后拿到注解指定的脫敏策略實(shí)例化這個(gè)脫敏策略枚舉類,應(yīng)用對(duì)應(yīng)的脫敏方法處理需要脫敏字段,得到脫敏后的值交給json生成器得到最終脫敏后的json
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
 
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.mijiu.commom.annotation.Desensitization;
import com.mijiu.commom.enumerate.DesensitizationStrategyEnum;
 
import java.io.IOException;
import java.util.Objects;
 
/**
 * 自定義的脫敏JSON序列化器
 * @author mijiupro
 */
 
 
public class DesensitizationJsonSerializable extends JsonSerializer<String> implements ContextualSerializer {
 
    private DesensitizationStrategyEnum desensitizationStrategy; // 脫敏策略
 
    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        // 將字符串按照設(shè)定的脫敏策略進(jìn)行脫敏處理后序列化到 JSON 中
        jsonGenerator.writeString(desensitizationStrategy.getDesensitization().apply(s));
    }
 
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        // 獲取屬性上的 Desensitization 注解
        Desensitization annotation = beanProperty.getAnnotation(Desensitization.class);
 
        // 判斷注解不為空且屬性類型為 String
        if (Objects.nonNull(annotation) && Objects.equals(String.class, beanProperty.getType().getRawClass())) {
            this.desensitizationStrategy = annotation.desensitizationStrategy(); // 設(shè)置脫敏策略
            return this;
        }
 
        // 返回默認(rèn)的序列化器
        return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
    }
}

4.編寫測(cè)試類

/**
 * @author mijiupro
 */
@Data
@Builder
public class PersonalInfo {
 
    @Desensitization(desensitizationStrategy = DesensitizationStrategyEnum.PHONE)
    private String phone; // 手機(jī)號(hào)
 
    @Desensitization(desensitizationStrategy = DesensitizationStrategyEnum.EMAIL)
    private String email; // 郵箱
 
    @Desensitization(desensitizationStrategy = DesensitizationStrategyEnum.ID_CARD)
    private String idCard; // 身份證號(hào)
 
    @Desensitization(desensitizationStrategy = DesensitizationStrategyEnum.ADDRESS)
    private String address; // 地址
 
    @Desensitization(desensitizationStrategy = DesensitizationStrategyEnum.BANK_CARD)
    private String bankCard; // 銀行卡號(hào)
 
    @Desensitization(desensitizationStrategy = DesensitizationStrategyEnum.NAME)
    private String name; // 姓名
 
    @Desensitization(desensitizationStrategy = DesensitizationStrategyEnum.PASSWORD)
    private String password; // 密碼
 
}

5.編寫測(cè)試接口

/**
 * @author mijiupro
 */
@RestController
@RequestMapping("/test/desensitization")
@Tag(name = "脫敏測(cè)試接口", description = "脫敏測(cè)試接口")
public class DesensitizationTestController {
    @GetMapping("/get-info")
    @Operation(summary = "獲取脫敏信息")
    public PersonalInfo getInt() {
 
 
        return PersonalInfo.builder()
                .name("言冰云")
                .phone("13812345678")
                .email("mijiu@qq.com")
                .idCard("110101199003073321")
                .address("四川省成都市郫都區(qū)百草路一號(hào)")
                .password("1234567890")
                .bankCard("62220210001234567890")
                .build();
    }
}

6.接口測(cè)試

這里通過swagger3進(jìn)行接口測(cè)試:

springboot3整合knife4j詳細(xì)圖文教程(swagger增強(qiáng))_java_腳本之家 (jb51.net)

測(cè)試結(jié)果:

寫在最后

springboot3實(shí)現(xiàn)優(yōu)雅的數(shù)據(jù)脫敏到這里就結(jié)束了,本文共列舉了實(shí)現(xiàn)了七種常見的類型的數(shù)據(jù)脫敏。

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

相關(guān)文章

  • java對(duì)接支付寶支付接口簡(jiǎn)單步驟記錄

    java對(duì)接支付寶支付接口簡(jiǎn)單步驟記錄

    最近項(xiàng)目APP需要接入微信、支付寶支付功能,在分配開發(fā)任務(wù)時(shí),聽說(shuō)微信支付接口比支付寶支付接口要難實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于java對(duì)接支付寶支付接口的簡(jiǎn)單步驟,需要的朋友可以參考下
    2024-05-05
  • 詳解Java的引用類型及使用場(chǎng)景

    詳解Java的引用類型及使用場(chǎng)景

    這篇文章主要介紹了詳解Java的引用類型及使用場(chǎng)景,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java中批處理框架spring batch詳細(xì)介紹

    Java中批處理框架spring batch詳細(xì)介紹

    這篇文章主要介紹了Java中批處理框架spring batch詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 一文詳解如何從零構(gòu)建Spring?Boot?Starter并實(shí)現(xiàn)整合

    一文詳解如何從零構(gòu)建Spring?Boot?Starter并實(shí)現(xiàn)整合

    Spring Boot是一個(gè)開源的Java基礎(chǔ)框架,用于創(chuàng)建獨(dú)立、生產(chǎn)級(jí)的基于Spring框架的應(yīng)用程序,這篇文章主要介紹了如何從零構(gòu)建Spring?Boot?Starter并實(shí)現(xiàn)整合的相關(guān)資料,需要的朋友可以參考下
    2025-03-03
  • 關(guān)于連接遠(yuǎn)程redis的流程

    關(guān)于連接遠(yuǎn)程redis的流程

    這篇文章主要介紹了關(guān)于連接遠(yuǎn)程redis的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • springboot圖片驗(yàn)證碼功能模塊

    springboot圖片驗(yàn)證碼功能模塊

    用戶登錄幾乎是一個(gè)線上系統(tǒng)必不可少且使用相對(duì)比較頻繁的一個(gè)模塊,為了防止惡意暴力嘗試,防止洪水攻擊、防止腳本自動(dòng)提交等,驗(yàn)證碼是一個(gè)較為便捷且行之有效的預(yù)防手段,這篇文章主要介紹了springboot圖片驗(yàn)證碼功能模塊,需要的朋友可以參考下
    2022-04-04
  • 在Java中實(shí)現(xiàn)二叉搜索樹的全過程記錄

    在Java中實(shí)現(xiàn)二叉搜索樹的全過程記錄

    二叉樹包含了根節(jié)點(diǎn),孩子節(jié)點(diǎn),葉節(jié)點(diǎn),每一個(gè)二叉樹只有一個(gè)根節(jié)點(diǎn),每一個(gè)結(jié)點(diǎn)最多只有兩個(gè)節(jié)點(diǎn),左子樹的鍵值小于根的鍵值,右子樹的鍵值大于根的鍵值,下面這篇文章主要給大家介紹了關(guān)于如何在Java中實(shí)現(xiàn)二叉搜索樹的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • SpringBoot + thymeleaf 實(shí)現(xiàn)讀取視頻列表并播放視頻功能

    SpringBoot + thymeleaf 實(shí)現(xiàn)讀取視頻列表并播放視頻功能

    這篇文章主要介紹了SpringBoot + thymeleaf 實(shí)現(xiàn)讀取視頻列表并播放視頻功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Java 判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞

    Java 判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞

    本篇文章主要介紹了判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-05-05
  • SpringBoot中的統(tǒng)一異常處理示例代碼

    SpringBoot中的統(tǒng)一異常處理示例代碼

    本文給大家介紹SpringBoot中的統(tǒng)一異常處理示例代碼,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2026-03-03

最新評(píng)論

尖扎县| 穆棱市| 汝阳县| 来安县| 昌江| 阳西县| 叶城县| 五常市| 门源| 乌拉特前旗| 黄大仙区| 鄂托克旗| 墨玉县| 巫溪县| 怀宁县| 江川县| 石首市| 天津市| 布拖县| 章丘市| 山西省| 海口市| 中阳县| 京山县| 清徐县| 光泽县| 左云县| 大余县| 当雄县| 白城市| 凯里市| 股票| 江西省| 普兰县| 静乐县| 洞头县| 焦作市| 临湘市| 琼海市| 南澳县| 孝感市|