Heim >Java >javaLernprogramm >So verwenden Sie die Jackson-Serialisierung, um eine Datendesensibilisierung in Java zu erreichen
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 (*).
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#🎜 🎜 #
: 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.
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 Desensibilisierungsschnittstellepackage 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);
}
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
#🎜 🎜# 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
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 vonpackage 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;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!