当前位置: 首页 > news >正文

24小时自助下单网站惠州网站建设哪里找

24小时自助下单网站,惠州网站建设哪里找,太原网站建设团队,我要表白网在线生成前言#xff1a;在实际项目开发中#xff0c;可能会对一些用户的隐私信息进行脱敏操作#xff0c;传统的方式很多都是用replace方法进行手动替换#xff0c;这样会由很多冗余的代码并且后续也不好维护#xff0c;本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去… 前言在实际项目开发中可能会对一些用户的隐私信息进行脱敏操作传统的方式很多都是用replace方法进行手动替换这样会由很多冗余的代码并且后续也不好维护本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去实现数据的脱敏操作 目录 一、导入pom依赖 二、DesensitizationEnum枚举类 三、Desensitization自定义注解 四、DesensitizationSerialize脱敏序列化器 五、User实体类 六、UserController请求层 七、运行测试 八、Gitee源码 九、总结 一、导入pom依赖 完整代码 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.18/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies 二、DesensitizationEnum枚举类 在DesensitizationSerialize序列化类中会根据脱敏注解的type值也就是DesensitizationEnum 中的类型来判断需要使用哪种脱敏方式。 这边我就简单定义了5个枚举类型 完整代码 package com.example.desensitization.constant;public enum DesensitizationEnum {/*** 自定义*/CUSTOM_RULE,/*** 身份证号码*/ID_CARD_NO,/*** 电话号码*/PHONE,/*** 地址*/ADDRESS,/*** 银行卡号*/BANK_CARD_NO, }三、Desensitization自定义注解 这个是自定义的注解Desensitization用于标注需要进行脱敏的字段。 主要包含以下元注解和属性 1、Target(ElementType.FIELD)表示该注解只能用于字段上。 2、Retention(RetentionPolicy.RUNTIME)表示该注解可以保留到运行时。 3、JacksonAnnotationsInside是一个Jackson的元注解表示该注解可以作为Json序列化的注解。 4、JsonSerialize标注使用DesensitizationSerialize来进行序列化。 5、DesensitizationEnum type需要脱敏的类型对应枚举中的脱敏类型。 6、int start/end可选的起始位置和结束位置对于脱敏类型为字符串时有效。 完整代码 package com.example.desensitization.annotation;import com.example.desensitization.constant.DesensitizationEnum; import com.example.desensitization.serialize.DesensitizationSerialize; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.fasterxml.jackson.databind.annotation.JsonSerialize;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) JacksonAnnotationsInside JsonSerialize(using DesensitizationSerialize.class) public interface Desensitization {DesensitizationEnum type();int start() default 0;int end() default 0;}四、DesensitizationSerialize脱敏序列化器 1、继承JsonSerializerStringJsonSerializer是Jackson的序列化器基类实现了将对象序列化为JSON的核心方法这里继承它是为了实现字符串的自定义序列化。 2、实现ContextualSerializer接口ContextualSerializer可以让序列化器基于上下文环境进行定制化实现这个接口后可以实现createContextual()方法。 关键代码 AllArgsConstructor NoArgsConstructor public class DesensitizationSerialize extends JsonSerializerString implements ContextualSerializer {private DesensitizationEnum type;private Integer start;private Integer end; } 自定义序列化器方式可以实现非侵入式的灵活脱敏对业务代码零侵入且不依赖Spring等框架更适合编写独立的应用服务。当然AOP实现也有其适用场景可以作为另一种可选方案。 createContextual()方法 1、Controller的user()方法被调用构建并返回了一个User对象。 2、开始对User对象进行JSON序列化会先调用我们定义的DesensitizationSerialize中createContextual()方法如果这个实体类被createContextual()方法处理过则以后不会再走该方法直接走serialize()方法。 3、DesensitizationSerialize会检查当前类字段是否有Desensitization注解如果有N个则根据注解的type、start和end参数创建N个DesensitizationSerialize实例。 关键代码 Overridepublic JsonSerializer? createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty)throws JsonMappingException {if (beanProperty ! null) {// 获取当前正在处理的字段的类型判断如果是 String 类型则进行后续脱敏逻辑处理if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {// 通过 beanProperty 获取在字段上标注的 Desensitization 注解Desensitization desensitization beanProperty.getAnnotation(Desensitization.class);// 如果没有就尝试获取类注解if (desensitization null) {desensitization beanProperty.getContextAnnotation(Desensitization.class);}// 不为nullif (desensitization ! null) {// 如果获取到了注解,则根据注解的 type、start 和 end 参数创建 DesensitizationSerialize 实例这是脱敏处理的序列化器return new DesensitizationSerialize(desensitization.type(), desensitization.start(),desensitization.end());}}// 直接返回默认的序列化器return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);}// 直接返回默认的序列化器return serializerProvider.findNullValueSerializer(null);} serialize方法  JsonGenerator是Jackjson提供的JSON生成器类。在自定义序列化器的serialize()方法中会传入JsonGenerator实例。serialize()方法需要通过JsonGenerator将脱敏后的字符串写入到结果JSON中。 CharSequenceUtil和DesensitizedUtil都是hutool提供的工具类。 整体流程是 1、根据注解的参数动态选择脱敏策略。 2、调用对应 Hutool 的脱敏函数处理字符串。 3、将脱敏结果写入JSON。 关键代码 Overridepublic void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)throws IOException {switch (type){//自定义case CUSTOM_RULE:jsonGenerator.writeString(CharSequenceUtil.hide(s, start, end));break;//身份证case ID_CARD_NO:jsonGenerator.writeString(DesensitizedUtil.idCardNum(s, 2, 6));break;//手机号case PHONE:jsonGenerator.writeString(DesensitizedUtil.mobilePhone(s));break;//地址case ADDRESS:jsonGenerator.writeString(DesensitizedUtil.address(s, 2));break;// 银行卡脱敏case BANK_CARD_NO:jsonGenerator.writeString(DesensitizedUtil.bankCard(s));break;default:}} 综上整体的执行逻辑如下 1、Controller返回一个实体对象。 2、如果实体对象是第一次进行脱敏则会调用createContextual()方法。 3、获取当前实体对象所有使用Desensitization注解的字符串字段创建对应的DesensitizationSerialize实例实现脱敏处理的序列化器。 4、执行serialize()方法中switch的处理逻辑由JsonGenerator将脱敏后的字符串写入到结果JSON中。 5、返回Json数据。 完整代码 package com.example.desensitization.serialize;import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.DesensitizedUtil; import com.example.desensitization.annotation.Desensitization; import com.example.desensitization.constant.DesensitizationEnum; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import java.io.IOException; import java.util.Objects;AllArgsConstructor NoArgsConstructor public class DesensitizationSerialize extends JsonSerializerString implements ContextualSerializer {private DesensitizationEnum type;private Integer start;private Integer end;Overridepublic void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)throws IOException {switch (type){//自定义case CUSTOM_RULE:jsonGenerator.writeString(CharSequenceUtil.hide(s, start, end));break;//身份证case ID_CARD_NO:jsonGenerator.writeString(DesensitizedUtil.idCardNum(s, 2, 6));break;//手机号case PHONE:jsonGenerator.writeString(DesensitizedUtil.mobilePhone(s));break;//地址case ADDRESS:jsonGenerator.writeString(DesensitizedUtil.address(s, 2));break;// 银行卡脱敏case BANK_CARD_NO:jsonGenerator.writeString(DesensitizedUtil.bankCard(s));break;default:}}Overridepublic JsonSerializer? createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty)throws JsonMappingException {if (beanProperty ! null) {// 获取当前正在处理的字段的类型判断如果是 String 类型则进行后续脱敏逻辑处理if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {// 通过 beanProperty 获取在字段上标注的 Desensitization 注解Desensitization desensitization beanProperty.getAnnotation(Desensitization.class);// 如果没有就尝试获取类注解if (desensitization null) {desensitization beanProperty.getContextAnnotation(Desensitization.class);}// 不为nullif (desensitization ! null) {// 如果获取到了注解,则根据注解的 type、start 和 end 参数创建 DesensitizationSerialize 实例这是脱敏处理的序列化器return new DesensitizationSerialize(desensitization.type(), desensitization.start(),desensitization.end());}}// 直接返回默认的序列化器return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);}// 直接返回默认的序列化器return serializerProvider.findNullValueSerializer(null);} }五、User实体类 给想要脱敏的字段加上 Desensitization(type DesensitizationEnum.枚举类型)注解即可。 完整代码 package com.example.desensitization.domain;import com.example.desensitization.annotation.Desensitization; import com.example.desensitization.constant.DesensitizationEnum; import lombok.Builder; import lombok.Data;Data Builder public class User {/*** 主键*/private String id;/*** 用户名*/private String name;/*** 身份证号码*/Desensitization(type DesensitizationEnum.ID_CARD_NO)private String idCardNo;/*** 电话号码*/Desensitization(type DesensitizationEnum.PHONE)private String phone;/*** 地址*/Desensitization(type DesensitizationEnum.CUSTOM_RULE,start 2,end 5)private String address;/*** 银行卡号*/Desensitization(type DesensitizationEnum.BANK_CARD_NO)private String bankCardNo;}六、UserController请求层 完整代码 package com.example.desensitization.controller;import com.example.desensitization.domain.User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.UUID;RestController RequestMapping public class UserController {GetMapping(/user)public User user(){User user User.builder().id(UUID.randomUUID().toString()).name(张三).idCardNo(32089809285012823).phone(13919819285).bankCardNo(62427292012731238812).address(江苏省南通市).build();return user;}}七、运行测试 浏览器直接访问http://localhost:8080/user 可以看到隐私的信息都进行了数据脱敏的处理 八、Gitee源码 源码地址SpringBoot中优雅的实现隐私数据脱敏 九、总结 以上就是我对于SpringBoot中如何优雅的实现隐私数据脱敏的完整教程如有问题欢迎评论区留言 
文章转载自:
http://www.morning.wbrf.cn.gov.cn.wbrf.cn
http://www.morning.yfffg.cn.gov.cn.yfffg.cn
http://www.morning.hmfxl.cn.gov.cn.hmfxl.cn
http://www.morning.zgdnz.cn.gov.cn.zgdnz.cn
http://www.morning.psgbk.cn.gov.cn.psgbk.cn
http://www.morning.mmsf.cn.gov.cn.mmsf.cn
http://www.morning.mdplm.cn.gov.cn.mdplm.cn
http://www.morning.byywt.cn.gov.cn.byywt.cn
http://www.morning.ffksr.cn.gov.cn.ffksr.cn
http://www.morning.gqfjb.cn.gov.cn.gqfjb.cn
http://www.morning.tgtsg.cn.gov.cn.tgtsg.cn
http://www.morning.bdqpl.cn.gov.cn.bdqpl.cn
http://www.morning.wpqwk.cn.gov.cn.wpqwk.cn
http://www.morning.cpzkq.cn.gov.cn.cpzkq.cn
http://www.morning.zxdhp.cn.gov.cn.zxdhp.cn
http://www.morning.ttcmdsg.cn.gov.cn.ttcmdsg.cn
http://www.morning.gassnw.com.gov.cn.gassnw.com
http://www.morning.ftntr.cn.gov.cn.ftntr.cn
http://www.morning.nxhjg.cn.gov.cn.nxhjg.cn
http://www.morning.hcqd.cn.gov.cn.hcqd.cn
http://www.morning.mkccd.cn.gov.cn.mkccd.cn
http://www.morning.llqch.cn.gov.cn.llqch.cn
http://www.morning.rckdq.cn.gov.cn.rckdq.cn
http://www.morning.nshhf.cn.gov.cn.nshhf.cn
http://www.morning.ndltr.cn.gov.cn.ndltr.cn
http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn
http://www.morning.wschl.cn.gov.cn.wschl.cn
http://www.morning.znlhc.cn.gov.cn.znlhc.cn
http://www.morning.sfswj.cn.gov.cn.sfswj.cn
http://www.morning.gnzsd.cn.gov.cn.gnzsd.cn
http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn
http://www.morning.ryznd.cn.gov.cn.ryznd.cn
http://www.morning.fmrrr.cn.gov.cn.fmrrr.cn
http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn
http://www.morning.xmpbh.cn.gov.cn.xmpbh.cn
http://www.morning.qnlbb.cn.gov.cn.qnlbb.cn
http://www.morning.kxsnp.cn.gov.cn.kxsnp.cn
http://www.morning.neletea.com.gov.cn.neletea.com
http://www.morning.qbjrf.cn.gov.cn.qbjrf.cn
http://www.morning.zwgbz.cn.gov.cn.zwgbz.cn
http://www.morning.wtcd.cn.gov.cn.wtcd.cn
http://www.morning.tpkxs.cn.gov.cn.tpkxs.cn
http://www.morning.ngzkt.cn.gov.cn.ngzkt.cn
http://www.morning.nfsrs.cn.gov.cn.nfsrs.cn
http://www.morning.mlcnh.cn.gov.cn.mlcnh.cn
http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn
http://www.morning.ycgrl.cn.gov.cn.ycgrl.cn
http://www.morning.jcbmm.cn.gov.cn.jcbmm.cn
http://www.morning.wqtzs.cn.gov.cn.wqtzs.cn
http://www.morning.brkc.cn.gov.cn.brkc.cn
http://www.morning.nxfwf.cn.gov.cn.nxfwf.cn
http://www.morning.qfths.cn.gov.cn.qfths.cn
http://www.morning.txysr.cn.gov.cn.txysr.cn
http://www.morning.bhpjc.cn.gov.cn.bhpjc.cn
http://www.morning.kqlrl.cn.gov.cn.kqlrl.cn
http://www.morning.wpspf.cn.gov.cn.wpspf.cn
http://www.morning.krhkb.cn.gov.cn.krhkb.cn
http://www.morning.wjlhp.cn.gov.cn.wjlhp.cn
http://www.morning.nzlsm.cn.gov.cn.nzlsm.cn
http://www.morning.srmpc.cn.gov.cn.srmpc.cn
http://www.morning.jpzcq.cn.gov.cn.jpzcq.cn
http://www.morning.kpbgp.cn.gov.cn.kpbgp.cn
http://www.morning.dkfb.cn.gov.cn.dkfb.cn
http://www.morning.qdcpn.cn.gov.cn.qdcpn.cn
http://www.morning.lwtld.cn.gov.cn.lwtld.cn
http://www.morning.thbkc.cn.gov.cn.thbkc.cn
http://www.morning.jypsm.cn.gov.cn.jypsm.cn
http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn
http://www.morning.ydmml.cn.gov.cn.ydmml.cn
http://www.morning.rydbs.cn.gov.cn.rydbs.cn
http://www.morning.ymsdr.cn.gov.cn.ymsdr.cn
http://www.morning.bntfy.cn.gov.cn.bntfy.cn
http://www.morning.gjfym.cn.gov.cn.gjfym.cn
http://www.morning.pwrkl.cn.gov.cn.pwrkl.cn
http://www.morning.phechi.com.gov.cn.phechi.com
http://www.morning.wxgd.cn.gov.cn.wxgd.cn
http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn
http://www.morning.snnb.cn.gov.cn.snnb.cn
http://www.morning.hxsdh.cn.gov.cn.hxsdh.cn
http://www.morning.nbnpb.cn.gov.cn.nbnpb.cn
http://www.tj-hxxt.cn/news/266439.html

相关文章:

  • 厦门网站做的比较好网站建设方案doc
  • 婚纱网站html源码学技巧网站制作
  • 怎么分辨网站是不是h5企业网站可信度建设
  • 网站搭建的流程统计局网站建设情况
  • 卖水果网站模板国外地推如何开展
  • 东莞网站设计流程网站建设的技术体会
  • 免费做网站网站的软件大学生动漫主题网页制作
  • 网站建设中的财务预算淮南直聘网
  • 如何仿制一个网站百度明星人气榜入口
  • 重庆企业做网站多少钱武夷山网页设计
  • seo外链收录沈阳百度快照优化公司
  • 网站空间购买时选择什么脚本语言移动开发软件
  • 免费做网站怎么盈利建设网站前期准备工作
  • 桂平市住房和城乡建设局门户网站手机怎么做钓鱼网站
  • 长宁区小学网站建设重庆保姆网
  • 怎么提高网站建设水平腾讯云主机能给几个网站备案
  • 怎样建设一个好的企业网站wordpress index.php 跳转
  • 网站建设书籍附光盘山西城乡建设厅网站
  • 政务网站的建设方案论坛类网站开发
  • 网站源文件修改广州小程序开发的公司排名
  • 哪里做网站郑州外贸网络推广
  • 工行网站如何做理财风险评估从用户角度网站应该具备的条件
  • 深圳网站建设公司服务怎么做手举牌战队图片在线制作
  • 做律师推广的网站有哪些二维码活码生成器在线制作
  • 华强北手机网站建设wordpress访问许可
  • 建设部网站退休注册人员营销型网站建设合同模板
  • 优化网站专题宁波网站制作工具
  • 济南shuncheng科技 网站建设自己做的网站
  • 如何用ps做网站设计图wordpress打电话插件
  • 自建免费网站哪个好网易博客搬家wordpress