范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

利用Jackson序列化实现数据脱敏

  几天前使用了Jackson对数据的自定义序列化。突发灵感,利用此方法来简单实现接口返回数据脱敏,故写此文记录。核心思想是利用Jackson的StdSerializer,@JsonSerialize,以及自己实现的数据脱敏过程。
  使用效果如下:首先在需要进行脱敏的VO字段上面标注相关脱敏注解
  调用接口即可看到脱敏效果
  实现过程如下:1. 定义脱敏的过程实现 /**  * Created by EalenXie on 2021/9/24 15:52  * 顶级的脱敏器  */ public interface Desensitization {      /**      * 脱敏实现      *      * @param target 脱敏对象      * @return 脱敏返回结果      */     T desensitize(T target);  }
  比如具体的手机号脱敏器实现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.定义脱敏注解,并指明了使用的序列化器,注解中声明了使用的脱敏器实现 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 {     /**      * 脱敏器实现      */     @SuppressWarnings("all")     Class<? extends Desensitization<?>> desensitization(); }  3. 实现定义的序列化器 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 implements ContextualSerializer {      private transient Desensitization desensitization;      protected ObjectDesensitizeSerializer() {         super(Object.class);     }      public Desensitization getDesensitization() {         return desensitization;     }      public void setDesensitization(Desensitization desensitization) {         this.desensitization = desensitization;     }      @Override     public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) {         Desensitize annotation = property.getAnnotation(Desensitize.class);         return createContextual(annotation.desensitization());     }      @SuppressWarnings("unchecked")     public JsonSerializer createContextual(Class<? extends Desensitization<?>> clazz) {         ObjectDesensitizeSerializer serializer = new ObjectDesensitizeSerializer();         if (clazz != StringDesensitization.class) {             serializer.setDesensitization((Desensitization) DesensitizationFactory.getDesensitization(clazz));         }         return serializer;     }      @Override     public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {         Desensitization 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.代码的设计说明
  完整代码可见 : github.com/EalenXie/ja…另附 基于Logback的日志脱敏方案(笔者认为这可能是全网最简单快捷的)
  原理是利用Logback的自定义日志转换器ClassicConverter1. 自定义脱敏日志转换器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 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的静态变量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);     } }
  启动后可以看到日志脱敏效果。
  作者:EalenXie
  链接:https://juejin.cn/post/7018055632209051684
在今天,5G真的那么重要吗?前面已经讲了好几期关于品牌信任的文章了,这不又一个活生生的例子来了!8月12日华为P50开售,当天就被一扫而空,这反映了华为用户和品牌的黏度之高,和信任度的牢固。当初商家和用户都担华为手机怎么充电好?关于手机充电这个问题一直存在争议,其实不单单华为手机,其它手机用的也是目前主流的锂电池,它们充电注意都是一样的。只需要按照正确方法使用,锂电池使用寿命都是比较长的。什么情况下最伤电荣耀Magic3支持数字人民币硬件钱包,数字货币终将走进千万家昨天(8月12日)晚上,脱离华为自成独立品牌将近10个月的荣耀,在万众瞩目中发布了进军高端市场的全新旗舰手机荣耀Magic3。可以毫不夸张地说,无论是对于华为和荣耀两个品牌,还是对手机被人定位监控,需要怎么取消?这个事情还是比较可怕的,不过也不难解决,尽量还是能早发现早处理,下面说一下具体方法首先我们要知道手机被定位监控的原理是什么,目前主要有两种方式,第一个是物理监控的方式,简而言之就是Mate40Pro与iPhone12ProMax该如何选择?一个是安卓的末代机皇,一个iPhone史上最强,两者该如何选择?让我们分别从性能信号外观续航和拍照上分别对比一下。对比完,就知道该如何选择了。性能末代麒麟PK苹果杀手锏A14史上最比较实用的手机APP有哪些?我推荐三类软件给你,用于日常的学习,工作,生活中,可以极大方便我们的生活,有效提高工作效率。一。学习类在学习中,我推荐一些手机软件,比如,WPS,PDF阅读器,腾讯翻译君,百度网盘新能源车吐槽声不断,为何有人却说开了新能源车不想开燃油车?在相关政策的推动下,新能源汽车在国内市场上的销量越来越高。再加上造车技术的进步,人们对新能源汽车的认可度也越来越高了。有一些购买了新能源汽车的车主还表示,开了新能源汽车后,自己都不人的偏见,开始影响科技真伪,为核心决策真实性,人类开始想办法现在已经进入了数字化时代,不论是企业还是国家,都在尽快做好数字化转型工作。但是在这个转型过程之中,人与科技之间难免发生矛盾。例如人工智能技术,已经被应用多年。像我们经常可以看到的推专帮AppleID和手机号网上随便买?是的,60元就有1万条近日,有大量苹果用户向专帮平台反馈,自己iPhoneiPad等设备的共享相簿中频繁收到博彩淘宝刷单抖音涨粉等广告的推送,实在避之不及。即使一一将垃圾内容举报,广告内容还是会源源不断合发快报技术服务市场合发全球合美惠CTO教创业者做流量分析合发全球合美惠电商运营培训师指出,电商APP运营要学会做好流量分析,而在流量分析中,有几个关键指标是创业者必须要弄清楚的。此外,互联网创业者还必须懂一些基础的互联网知识,比如什么是科技浪潮之下,方太的信条撰文陈晓平韩璐编辑陈晓平一系列整治,降临到算法上。在外卖领域,七部门发文,要求不得将最严算法作为考核要求,合理确定订单数量准时率在线率等考核要素在未成年人保护领域,清朗专项行动要求
深度评测丨美膳雅数码玻璃电蒸锅召之即来的美味与健康图文占优智能葡萄当源远流长的食文化遇到科技感十足的现代炊具,会擦出怎样的火花?源自美国拥有40多年品牌历史的Cuisinart美膳雅给出的答案是美味,健康和高效。作为首屈一指的厨房万城数码携手索尼,隆重发布新一代ICDTX660录音笔2021年7月15日,由万城数码携手索尼,双方共同主办的索尼数码录音棒行业品鉴会暨随身录转短视频创作分享会在上海隆重举办。在本次活动上,双方高层和来自全国的经销商汇聚一堂。索尼也正美股投资者小心!GameStop事件后金融交易税或开征在GameStop狂热后,美国白宫支持研究金融交易税的好处和坏处!据国会预算办公室(CBO)估计,金融交易税十年内最少可为联邦政府带进7770亿美元税收。白宫发言人指出,GameS比特币将涨至100万美元?美联储无损美元地位2月17日,随着机构投资者及大型公司的大手笔买入,比特币首次突破50,000美元,而涨势如虹持续吸引全球中小投资者入场,一道推动比特币这个全球最大加密货币价格翻越新一道里程碑。据C老款玄冰400品控差异能有多大?要想散热好须要滴血认亲最近正在做新版玄冰400的评测,也看了不少别人测过的,按照不少大佬的意思,即便同一款散热器之间也可能有品控的差异,于是老款玄冰400我就买了两个。想着平衡下,去一个平均值,这不测不ATFX再次斩获世界级大奖,夺得最具影响力十大企业奖ATFX动态从过去一年左右的时间来看,全球各行业都受到了新冠肺炎病毒爆发的影响,同样,金融行业也受到了病毒大流行的波及,导致了一些起起落落。然而,在金融科技高强度的协作下,投资比以西汉姆联合作伙伴ScopeMarkets品牌新形象首次在球队队服亮相2021年7月15日,屡获殊荣的在线交易商ScopeMarkets斯科普在伦敦宣布,作为品牌新形象更新的一部分,其新标志将首次成为西汉姆联队球衣的袖标。在此之前,自2018年以来,这一投资品种不容忽视,ETF投资年化回报竟达到20倍ETF(交易所交易基金)为投资者提供了一种有效且具有成本效益的方式来投资股票市场和其他资产类别。第一只ETF于1993年推出,但是自2005年以来,ETF交易规模得到飞速发展。在大2021年荣耀之战冠军诞生!快来看看谁瓜分了10万美元大奖池TMGM第二届全球交易大赛荣耀之战逆转翻盘进入2021年,疫苗的逐步上市似乎意味着疫情即将迎来曙光。然而伴随着病毒变种的全球扩散,金融市场依旧充满着不确定性,但金融市场的波动也意味十余股批量涨停!风电板块再燃热度,抢装潮刺激行业景气度财联社(上海,编辑梓隆)讯,今日,风电板块强势爆发,个股掀起涨停潮,截止午间收盘,双一科技20cm涨停,华东重工宁波东力京运通吉鑫科技中天科技佳电股份明阳智能恒润股份中闽能源天顺风股民欲关灯吃面安井食品紧接派发利好部分产品提价最高为10财联社(厦门,记者李子健)讯,11月1日,安井食品(603345。SH)开盘不到5分钟即遇跌停。消息面上,多机构认为公司Q3业绩低于市场预期。股民正欲关灯吃面,安井食品却紧接派发利