Heim  >  Artikel  >  Java  >  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

王林
王林nach vorne
2023-04-18 09:46:10698Durchsuche

    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);
            }
    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);
    }

    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);
                }
            });
    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> {
    }

    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;
    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!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen