欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

寫在前面

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

內容簡介

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

效果展示:

實現(xiàn)思路

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

實現(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();//這是自定義的脫敏策略枚舉類型,用于指定脫敏策略,獲取對應脫敏處理方法
 
}

2.編寫脫敏策略枚舉類

脫敏的本質其實就是個字符串的替換,我們在脫敏策略枚舉類中通過定義函數(shù)接口,維護多種類型脫敏策略對應的字符串替換方法。這樣做可以保證可維護性可擴展性。

import lombok.Getter;
 
import java.util.function.Function;
 
 
/**
 * 脫敏策略枚舉類,維護對不同類型信息的脫敏處理方式
 * @author mijiupro
 */
@Getter
public enum DesensitizationStrategyEnum {
 
    // 手機號脫敏策略,保留前三位和后四位
    PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
 
    // 郵箱脫敏策略,保留郵箱用戶名第一個字符和@符號前后部分
    EMAIL(s -> s.replaceAll("(\\w)[^@]*(@\\w+\\.\\w+)", "$1****$2")),
 
    // 身份證號脫敏策略,保留前四位和后四位
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1*****$2")),
 
    // 地址脫敏策略,保留省市信息,其余部分脫敏為**
    ADDRESS(s -> s.replaceAll("([\\u4e00-\\u9fa5]{2})[\\u4e00-\\u9fa5]+", "$1**")),
 
    // 銀行卡號脫敏策略,保留前四位和后三位
    BANK_CARD(s -> s.replaceAll("(\\d{4})\\d{8,12}(\\d{3})", "$1************$2")),
 
    // 姓名脫敏策略,保留姓氏第一個字符,其余部分脫敏為**
    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序列化實現(xiàn)

需要清楚

  • 平時接口返回的數(shù)據(jù)結構直接都是交給默認的序列化器把對象轉成json的。
  • 實現(xiàn)脫敏的本質就是在這前面添加了一段邏輯,找到帶有脫敏注解的屬性然后拿到注解指定的脫敏策略實例化這個脫敏策略枚舉類,應用對應的脫敏方法處理需要脫敏字段,得到脫敏后的值交給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 {
        // 將字符串按照設定的脫敏策略進行脫敏處理后序列化到 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(); // 設置脫敏策略
            return this;
        }
 
        // 返回默認的序列化器
        return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
    }
}

4.編寫測試類

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

5.編寫測試接口

/**
 * @author mijiupro
 */
@RestController
@RequestMapping("/test/desensitization")
@Tag(name = "脫敏測試接口", description = "脫敏測試接口")
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ū)百草路一號")
                .password("1234567890")
                .bankCard("62220210001234567890")
                .build();
    }
}

6.接口測試

這里通過swagger3進行接口測試:

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

測試結果:

寫在最后

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

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

相關文章

  • 從源碼角度看spring mvc的請求處理過程

    從源碼角度看spring mvc的請求處理過程

    這篇文章主要介紹了從源碼角度看spring mvc的請求處理過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • 淺談JAVA字符串匹配算法indexOf函數(shù)的實現(xiàn)方法

    淺談JAVA字符串匹配算法indexOf函數(shù)的實現(xiàn)方法

    這篇文章主要介紹了淺談字符串匹配算法indexOf函數(shù)的實現(xiàn)方法,indexOf函數(shù)我們可以查找一個字符串(模式串)是否在另一個字符串(主串)出現(xiàn)過。對此感興趣的可以來了解一下
    2020-07-07
  • MyBatis一對一映射初識教程

    MyBatis一對一映射初識教程

    MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。在我們生活中一對一的例子很多見,下面通過本文給大家?guī)砹薽ybatis一對一映射初識教程,感興趣的朋友一起看下吧
    2016-08-08
  • 簡單了解mybatis攔截器實現(xiàn)原理及實例

    簡單了解mybatis攔截器實現(xiàn)原理及實例

    這篇文章主要介紹了簡單了解mybatis攔截器實現(xiàn)原理及實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot自定義FailureAnalyzer詳解

    SpringBoot自定義FailureAnalyzer詳解

    這篇文章主要介紹了SpringBoot自定義FailureAnalyzer詳解,FailureAnalyzer是一種在啟動時攔截?exception?并將其轉換為?human-readable?消息的好方法,包含在故障分析中,需要的朋友可以參考下
    2023-11-11
  • SpringBoot處理跨域請求(CORS)的五種方式

    SpringBoot處理跨域請求(CORS)的五種方式

    跨域資源共享(CORS)是現(xiàn)代Web開發(fā)中常見的問題,Spring?Boot提供了多種方式來處理CORS請求,下面我將詳細介紹各種實現(xiàn)方式及其適用場景,需要的朋友可以參考下
    2025-04-04
  • JeecgBoot框架升級至Spring?Boot3的實戰(zhàn)步驟

    JeecgBoot框架升級至Spring?Boot3的實戰(zhàn)步驟

    本文主要介紹了JeecgBoot框架升級至Spring?Boot3的實戰(zhàn)步驟,從?2.7.10升級到3.1.5有以下幾個點需要注意,下面就來詳細的介紹一下,感興趣的可以了解一下
    2024-04-04
  • Java 實現(xiàn)限流器處理Rest接口請求詳解流程

    Java 實現(xiàn)限流器處理Rest接口請求詳解流程

    在工作中是否會碰到這樣的場景,高并發(fā)的請求但是無法全部執(zhí)行,需要一定的限流。如果你是使用的微服務框架,比如SpringCloud,可以使用Gateway增加限流策略來解決。本篇文章是在沒有框架的情況實現(xiàn)限流器
    2021-11-11
  • Java中啟動線程start和run的兩種方法

    Java中啟動線程start和run的兩種方法

    start()方法它的作用是啟動一個新線程,run()就和普通的成員方法一樣,可以被重復調用。接下來通過本文給大家分享Java中啟動線程start和run的兩種方法,需要的朋友參考下吧
    2017-11-11
  • Java實用工具庫commons-lang3的使用

    Java實用工具庫commons-lang3的使用

    Apache?Commons?Lang?3是一個流行的Java實用工具庫,提供了對java.lang包的擴展,包括字符串操作、正則表達式處理、數(shù)字操作、日期和時間操作、隨機字符串生成和對象操作等功能
    2025-03-03

最新評論