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

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

 更新時間:2021年10月13日 09:54:23   作者:EalenXie  
這篇文章主要介紹了利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏,首先在需要進行脫敏的VO字段上面標注相關脫敏注解,具體實例代碼文中給大家介紹的非常詳細,需要的朋友可以參考下

幾天前使用了Jackson對數(shù)據(jù)的自定義序列化。突發(fā)靈感,利用此方法來簡單實現(xiàn)接口返回數(shù)據(jù)脫敏,故寫此文記錄。

核心思想是利用Jackson的StdSerializer,@JsonSerialize,以及自己實現(xiàn)的數(shù)據(jù)脫敏過程。

使用效果如下:

首先在需要進行脫敏的VO字段上面標注相關脫敏注解

調(diào)用接口即可看到脫敏效果

實現(xiàn)過程如下:

1. 定義脫敏的過程實現(xiàn)

/**
 * Created by EalenXie on 2021/9/24 15:52
 * 頂級的脫敏器
 */
public interface Desensitization<T> {

    /**
     * 脫敏實現(xiàn)
     *
     * @param target 脫敏對象
     * @return 脫敏返回結果
     */
    T desensitize(T target);

}

比如具體的手機號脫敏器實現(xiàn)

import com.github.Symbol;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by EalenXie on 2021/9/24 15:56
 * 手機號脫敏器 默認只保留前3位和后4位
 */
public class PhoneDesensitization implements StringDesensitization {

    /**
     * 手機號正則
     */
    private static final Pattern DEFAULT_PATTERN = Pattern.compile("(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}");

    /**
     * 手機號脫敏 只保留前3位和后4位
     */
    @Override
    public String desensitize(String target) {
        Matcher matcher = DEFAULT_PATTERN.matcher(target);
        while (matcher.find()) {
            String group = matcher.group();
            target = target.replace(group, group.substring(0, 3) + Symbol.getSymbol(4, Symbol.STAR) + group.substring(7, 11));
        }
        return target;
    }
}

2.定義脫敏注解,并指明了使用的序列化器,注解中聲明了使用的脫敏器實現(xiàn)

package com.github.annotation;

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.github.desensitization.Desensitization;
import com.github.serializer.ObjectDesensitizeSerializer;

import java.lang.annotation.*;

/**
 * Created by EalenXie on 2021/10/8 11:30
 */
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = ObjectDesensitizeSerializer.class)
@Documented
public @interface Desensitize {
    /**
     * 脫敏器實現(xiàn)
     */
    @SuppressWarnings("all")
    Class<? extends Desensitization<?>> desensitization();
}

3. 實現(xiàn)定義的序列化器

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.github.Symbol;
import com.github.annotation.Desensitize;
import com.github.desensitization.Desensitization;
import com.github.desensitization.DesensitizationFactory;
import com.github.desensitization.StringDesensitization;

import java.io.IOException;

/**
 * Created by EalenXie on 2021/8/9 9:03
 * 脫敏序列化器
 */
public class ObjectDesensitizeSerializer extends StdSerializer<Object> implements ContextualSerializer {

    private transient Desensitization<Object> desensitization;

    protected ObjectDesensitizeSerializer() {
        super(Object.class);
    }

    public Desensitization<Object> getDesensitization() {
        return desensitization;
    }

    public void setDesensitization(Desensitization<Object> desensitization) {
        this.desensitization = desensitization;
    }

    @Override
    public JsonSerializer<Object> createContextual(SerializerProvider prov, BeanProperty property) {
        Desensitize annotation = property.getAnnotation(Desensitize.class);
        return createContextual(annotation.desensitization());
    }

    @SuppressWarnings("unchecked")
    public JsonSerializer<Object> createContextual(Class<? extends Desensitization<?>> clazz) {
        ObjectDesensitizeSerializer serializer = new ObjectDesensitizeSerializer();
        if (clazz != StringDesensitization.class) {
            serializer.setDesensitization((Desensitization<Object>) DesensitizationFactory.getDesensitization(clazz));
        }
        return serializer;
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        Desensitization<Object> objectDesensitization = getDesensitization();
        if (objectDesensitization != null) {
            try {
                gen.writeObject(objectDesensitization.desensitize(value));
            } catch (Exception e) {
                gen.writeObject(value);
            }
        } else if (value instanceof String) {
            gen.writeString(Symbol.getSymbol(((String) value).length(), Symbol.STAR));
        } else {
            gen.writeObject(value);
        }
    }
}

4.代碼的設計說明

完整代碼可見 : https://github.com/EalenXie/jackson-desensitize

另附 基于Logback的日志脫敏方案(筆者認為這可能是全網(wǎng)最簡單快捷的)

原理是利用Logback的自定義日志轉換器ClassicConverter

1. 自定義脫敏日志轉換器

import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.github.desensitization.EmailDesensitization;
import com.github.desensitization.IDCardDesensitization;
import com.github.desensitization.PhoneDesensitization;
import com.github.desensitization.StringDesensitization;

import java.util.ArrayList;
import java.util.List;


/**
 * @author EalenXie create on 2021/3/18 10:07
 * 此Converter提供支持日志脫敏
 * 1. 編寫此LogbackDesensitizeConverter
 * 2. 正則脫敏 手機號/郵箱/身份證
 */
public class LogbackDesensitizeConverter extends ClassicConverter {

    protected static final List<StringDesensitization> DESENSITIZATION_LIST = new ArrayList<>();

    static {
        // 手機號脫敏
        DESENSITIZATION_LIST.add(new PhoneDesensitization());
        // 郵箱脫敏
        DESENSITIZATION_LIST.add(new EmailDesensitization());
        // 身份證脫敏
        DESENSITIZATION_LIST.add(new IDCardDesensitization());
    }

    @Override
    public String convert(ILoggingEvent event) {
        String content = event.getMessage();
        try {
            for (StringDesensitization desensitization : DESENSITIZATION_LIST) {
                content = desensitization.desensitize(content);
            }
        } catch (Exception e) {
            // ig
        }
        return content;
    }
}

2. 啟動類為PatternLayout的靜態(tài)變量defaultConverterMap新增此自定義轉換器

import ch.qos.logback.classic.PatternLayout;
import com.github.filter.LogbackDesensitizeConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author EalenXie create on 2020/11/24 14:16
 */
@EnableDiscoveryClient
@SpringBootApplication
public class ApiGatewayApplication {
    public static void main(String[] args) {
        // 日志處理方案 新增一個Logback的日志脫敏轉換器
        PatternLayout.defaultConverterMap.put("m", LogbackDesensitizeConverter.class.getName());
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}

啟動后可以看到日志脫敏效果。

到此這篇關于利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏的文章就介紹到這了,更多相關Jackson序列化數(shù)據(jù)脫敏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatis類型處理器TypeHandler的作用及說明

    MyBatis類型處理器TypeHandler的作用及說明

    這篇文章主要介紹了MyBatis類型處理器TypeHandler的作用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java中的MapStruct用法詳解

    Java中的MapStruct用法詳解

    這篇文章主要介紹了Java中的MapStruct用法詳解,MapStuct的使用非常簡單,把對應的jar包引入即可,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • idea中使用(Revert Commit)圖解

    idea中使用(Revert Commit)圖解

    這篇文章主要介紹了idea中使用(Revert Commit)圖解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java實現(xiàn)WebSocket客戶端詳細步驟

    Java實現(xiàn)WebSocket客戶端詳細步驟

    這篇文章主要介紹了如何使用Java實現(xiàn)一個功能全面的WebSocket客戶端,包括引入依賴、創(chuàng)建客戶端類、實現(xiàn)連接、發(fā)送和接收消息、處理復雜消息、實現(xiàn)心跳機制、重連策略、異常處理、線程安全的隊列以及測試和調(diào)試,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • Java Netty核心模塊超詳細梳理

    Java Netty核心模塊超詳細梳理

    Netty是一個java開源項目,是一個異步的、基于事件驅動的網(wǎng)絡應用框架,用以開發(fā)高性能、高可用的網(wǎng)絡io程序,這篇文章主要介紹了Netty核心模塊
    2022-11-11
  • MyBatis完成CRUD?詳細細節(jié)內(nèi)容剖析

    MyBatis完成CRUD?詳細細節(jié)內(nèi)容剖析

    這篇文章主要介紹了MyBatis完成CRUD?詳細細節(jié)內(nèi)容剖析,本文通過圖文示例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-05-05
  • Java mysql詳細講解雙數(shù)據(jù)源配置使用

    Java mysql詳細講解雙數(shù)據(jù)源配置使用

    在開發(fā)過程中我們常常會用到兩個數(shù)據(jù)庫,一個數(shù)據(jù)用來實現(xiàn)一些常規(guī)的增刪改查,另外一個數(shù)據(jù)庫用來實時存數(shù)據(jù)。進行數(shù)據(jù)的統(tǒng)計分析。可以讀寫分離。可以更好的優(yōu)化和提高效率;或者兩個數(shù)據(jù)存在業(yè)務分離的時候也需要多個數(shù)據(jù)源來實現(xiàn)
    2022-06-06
  • java必學必會之equals方法

    java必學必會之equals方法

    java必學必會之equals方法,equals方法是 java.lang.Object 類的方法,想要了解更多關于equals方法的朋友,可以參考下文
    2015-12-12
  • 關于JAVA 數(shù)組的使用介紹

    關于JAVA 數(shù)組的使用介紹

    本篇文章小編將為大家介紹,關于JAVA 數(shù)組的使用介紹,有需要的朋友可以參考一下
    2013-04-04
  • 詳解mybatis三種分頁方式

    詳解mybatis三種分頁方式

    本文主要介紹了詳解mybatis三種分頁方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08

最新評論

桦川县| 万全县| 安宁市| 宁河县| 格尔木市| 肥城市| 建湖县| 丘北县| 富顺县| 长子县| 嘉黎县| 金寨县| 山西省| 乐清市| 县级市| 牙克石市| 宜昌市| 稻城县| 富蕴县| 马鞍山市| 建始县| 惠来县| 桃源县| 化州市| 日土县| 宜川县| 兴义市| 湘阴县| 仙游县| 永定县| 绍兴市| 沧州市| 施秉县| 屏南县| 南涧| 修文县| 蒙山县| 金华市| 徐水县| 美姑县| 大连市|