Inhaltsverzeichnis
1. Hintergrund
2. Ziel
3.1 Benutzerdefinierte desensibilisierte Serialisierungsimplementierung basierend auf Jackson
zurück. 4. Rufen Sie die Desensibilisierung der Mobiltelefonnummer auf, um MobileNoDesensitization#desensitize (3.3 oben) zu implementieren. 5. Geben Sie das desensibilisierte Serialisierungsergebnis aus, {"mobile":"133****5678"}
Heim Java javaLernprogramm So verwenden Sie die Jackson-Serialisierung, um eine Datendesensibilisierung in Java zu erreichen

So verwenden Sie die Jackson-Serialisierung, um eine Datendesensibilisierung in Java zu erreichen

Apr 18, 2023 am 09:46 AM
java jackson

    1. Hintergrund

    Einige vertrauliche Informationen im Projekt können nicht direkt angezeigt werden, z. B. die Mobiltelefonnummer des Kunden und die ID Karte, Nummernschild Informationen wie die Kontonummer müssen bei der Anzeige desensibilisiert werden, um ein Eindringen in die Privatsphäre des Kunden zu verhindern. Unter Desensibilisierung versteht man die Behandlung eines Teils der Daten mit Desensibilisierungssymbolen (*).

    2. Ziel

    • Wenn der Server Daten zurückgibt, verwenden Sie die Jackson-Serialisierung, um die Datendesensibilisierung abzuschließen und eine desensibilisierte Anzeige vertraulicher Informationen zu erreichen.

    • Reduzieren Sie die Anzahl wiederholter Entwicklungen und verbessern Sie die Entwicklungseffizienz

    • Formulieren Sie einheitliche und wirksame Desensibilisierungsregeln#🎜 🎜 #

    • Es kann auf der Desensibilisierungsmethode basieren, bei der die standardmäßige Desensibilisierungsimplementierung überschrieben wird, um die Desensibilisierungsanforderungen skalierbarer und anpassbarer personalisierter Geschäftsszenarien zu erfüllen

      # 🎜 🎜#
    • 3. Hauptimplementierung

    3.1 Benutzerdefinierte desensibilisierte Serialisierungsimplementierung basierend auf Jackson

    StdSerializer

    : alle Standards Die verwendete Basisklasse vom Serialisierer Dies ist die empfohlene Basisklasse zum Schreiben benutzerdefinierter Serialisierer.

    ContextualSerializer:

    ist eine weitere von Jackson bereitgestellte Serialisierungsschnittstelle. Ihre Funktion besteht darin, JsonSerializer anhand der dem Feld bekannten Kontextinformationen anzupassen.

    package com.jd.ccmp.ctm.constraints.serializer;
    
    
    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.jd.ccmp.ctm.constraints.Symbol;
    import com.jd.ccmp.ctm.constraints.annotation.Desensitize;
    import com.jd.ccmp.ctm.constraints.desensitization.Desensitization;
    import com.jd.ccmp.ctm.constraints.desensitization.DesensitizationFactory;
    import com.jd.ccmp.ctm.constraints.desensitization.DefaultDesensitization;
    
    
    
    
    import java.io.IOException;
    
    
    
    
    /**
     * 脱敏序列化器
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:10
     */
    public class ObjectDesensitizeSerializer extends StdSerializer<Object> implements ContextualSerializer {
        private static final long serialVersionUID = -7868746622368564541L;
        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 != DefaultDesensitization.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);
            }
    Nach dem Login kopieren
    Hinweis: createContextual kann den Feldtyp und die Anmerkungen abrufen. Wenn ein Feld über eine benutzerdefinierte Annotation verfügt, nehmen Sie den Wert in der Annotation und erstellen Sie eine benutzerdefinierte Serialisierungsmethode, damit der Wert in der Serialisierungsmethode abgerufen werden kann.

    createContextual

    Die Methode wird nur beim ersten Serialisieren des Felds aufgerufen (da sich die Kontextinformationen des Felds während der Laufzeit nicht ändern), sodass Sie sich keine Sorgen über Leistungsprobleme machen müssen. 3.2 Desensibilisierungsschnittstelle und Fabrikimplementierung definieren

    3.2.1 Definition der Desensibilisierungsschnittstelle

    package com.jd.ccmp.ctm.constraints.desensitization;
    
    
    /**
     * 脱敏器
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 10:56
     */
    public interface Desensitization<T> {
        /**
         * 脱敏实现
         *
         * @param target 脱敏对象
         * @return 脱敏返回结果
         */
        T desensitize(T target);
    }
    Nach dem Login kopieren

    3.2.2 Desensibilisierungsfabrik-Implementierung

    package com.jd.ccmp.ctm.constraints.desensitization;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    /**
     * 工厂方法
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 10:58
     */
    public class DesensitizationFactory {
        private DesensitizationFactory() {
        }
        private static final Map<Class<?>, Desensitization<?>> map = new HashMap<>();
    
    
    
    
        @SuppressWarnings("all")
        public static Desensitization<?> getDesensitization(Class<?> clazz) {
            if (clazz.isInterface()) {
                throw new UnsupportedOperationException("desensitization is interface, what is expected is an implementation class !");
            }
            return map.computeIfAbsent(clazz, key -> {
                try {
                    return (Desensitization<?>) clazz.newInstance();
                } catch (InstantiationException | IllegalAccessException e) {
                    throw new UnsupportedOperationException(e.getMessage(), e);
                }
            });
    Nach dem Login kopieren
    3.3 Häufig verwendete Desensibilisierungs-Implementierung

    3.3.1 Standard-Desensibilisierungsimplementierung

    #🎜 🎜# kann auf der Standardimplementierung basieren und erweitert werden, um personalisierte Szenarien zu implementieren Desensibilisierung gegenüber den mittleren 4 Ziffern der Mobiltelefonnummer Nr. 3.5 Desensibilisierung definieren Symbole

    unterstützt die Angabe von Desensibilisierungssymbolen wie * oder ^_^

    package com.jd.ccmp.ctm.constraints.desensitization;
    
    
    /**
     * 默认脱敏实现
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:01
     */
    public interface DefaultDesensitization extends Desensitization<String> {
    }
    Nach dem Login kopieren

    4. Anwendungsbeispiele und Ausführungsprozessanalyse

    Programmklassendiagramm

    #🎜🎜 #**Analyse des Ausführungsprozesses** 1. Rufen Sie JsonUtil.toJsonString() auf, um die Serialisierung zu starten

    2. Identifizieren Sie die Annotation @MobileNoDesensitize für das Attribut mobile (3.4 oben). .2) 3 . Rufen Sie ObjectDesensitizeSerializer#createContextual (3.1 und 3.2 oben) auf und geben Sie JsonSerializer

    zurück. 4. Rufen Sie die Desensibilisierung der Mobiltelefonnummer auf, um MobileNoDesensitization#desensitize (3.3 oben) zu implementieren. 5. Geben Sie das desensibilisierte Serialisierungsergebnis aus, {"mobile":"133****5678"}

    Es ist nicht schwierig, den Kernausführungsprozess zu finden. Es ist Schritt 3, aber wie sind @MobileNoDesensitize und ObjectDesensitizeSerializer verbunden? « 🎜 #

    Bei der Implementierung von ObjectDesensitizeSerializer scheinen wir jedoch die direkte Aufrufbeziehung des obigen Links nicht gefunden zu haben Jackson-Meta-Annotation Das Konzept von

    package com.jd.ccmp.ctm.constraints.desensitization;
    import com.jd.ccmp.ctm.constraints.Symbol;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    /**
     * 手机号脱敏器,保留前3位和后4位
     *
     * @author zhangxiaoxu15
     * @date 2022/2/8 11:02
     */
    public class MobileNoDesensitization implements DefaultDesensitization {
        /**
         * 手机号正则
         */
        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}");
    
    
    
    
        @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;
    Nach dem Login kopieren
    So verwenden Sie die Jackson-Serialisierung, um eine Datendesensibilisierung in Java zu erreichen beruht genau auf dem Mechanismus der „Combo-Annotationen“ (kombinierte Annotationen, gebündelte Annotationen), was darauf hinweist, dass Jackson die verwenden sollte Metaanmerkungen, die es besitzt, und anstelle der Verwendung von Zielanmerkungen wird eine benutzerdefinierte Desensibilisierung erreicht, um Designziele zu erreichen.

    Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Jackson-Serialisierung, um eine Datendesensibilisierung in Java zu erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    Video Face Swap

    Video Face Swap

    Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

    Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

    Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

    Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

    In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

    Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

    Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

    Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

    Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

    Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

    Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

    PHP vs. Python: Verständnis der Unterschiede PHP vs. Python: Verständnis der Unterschiede Apr 11, 2025 am 12:15 AM

    PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

    See all articles