首页 > 其他分享 >springboot 结合jackson数据脱敏

springboot 结合jackson数据脱敏

时间:2024-04-24 10:45:36浏览次数:24  
标签:function beanProperty DataMaskEnum jackson springboot class public 脱敏

 

  在返回字段时有时需要对电话,地址等字段进行脱敏处理

  1. 定义枚举脱敏类

  使用函数编程,绑定函数操作

public enum DataMaskEnum {
    /**
     *  名称脱敏
     */
    USERNAME(s->s.replaceAll("(\\S)\\S(\\S*)","$1*$2")),

    /**
     * 手机号脱敏
     */
    PHONE(s->s.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2")),

    /**
     * 地址脱敏
     */
    ADDRESS(s->s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}","$1****$2****"))
    ;

    private Function<String,String> function;

    DataMaskEnum(Function<String, String> function) {
        this.function = function;
    }

    public Function<String,String> function(){
        return this.function;
    }
}

 

  2. 定义脱敏注解

@Target({ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@JacksonAnnotationsInside
@JsonSerialize(using = DataMaskingSerializer.class)
public @interface DataMask {

    DataMaskEnum function() default DataMaskEnum.ADDRESS;
}

 

  3. 结合jackson脱敏处理

public final class DataMaskingSerializer extends JsonSerializer<String> implements ContextualSerializer {

    private DataMaskEnum dataMaskEnum;

    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(dataMaskEnum.function().apply(s));
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {

        DataMask annotation = beanProperty.getAnnotation(DataMask.class);
        if (annotation != null && String.class.equals(beanProperty.getType().getRawClass())){
            dataMaskEnum = annotation.function();
            return this;
        }

        return serializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);
    }
}

 

  4. 在实体类上添加注解,请求接口

@Data
public class PrjAssignDetailVO {

    @Schema(description ="客户联系电话")
    @DataMask(function = DataMaskEnum.PHONE)
    private String contactPhone;
}
    @GetMapping("/test/{id}")
    public R test(@PathVariable("id") String id){
        PrjAssign one = prjAssignService.lambdaQuery().eq(PrjAssign::getId, id).one();
        PrjAssignDetailVO prjAssignDetailVO = new PrjAssignDetailVO();
        BeanUtil.copyProperties(one, prjAssignDetailVO);
        return R.ok(prjAssignDetailVO);
    }

 

标签:function,beanProperty,DataMaskEnum,jackson,springboot,class,public,脱敏
From: https://www.cnblogs.com/homle/p/18154550

相关文章

  • springboot源码:容器启动过程(扩展业务对象、bean 生命周期)&动态注册自己的业务对象&
    0.SpringbootRun方法启动org.springframework.boot.SpringApplication#run(java.lang.String...)启动 publicConfigurableApplicationContextrun(String...args){ longstartTime=System.nanoTime(); DefaultBootstrapContextbootstrapContext=createBootstrap......
  • springboot~mybatis-plus中使用TypeHandler做类型映射
    mybatis-plus中,如果数据表字段类型与java实体字段类型不一样,这时就需要做类型映射与转换了,我们一般可以实现TypeHandler接口,或者继承抽象类BaseTypeHandler,我们下面举例来说明一下它的使用方法。场景数据表里字段是varchar,java里是List集合,例如:我的爱好标签数据表里字段是varc......
  • SpringBoot整合OpenAPI 3生成在线接口文档
    SpringBoot整合springdoc-openapi,自动生成在线接口文档。1、引入pom依赖<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.3.0</version></dependenc......
  • springboot 接口限制访问频率
     1.自定义注解@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public@interfaceRateLimit{//默认最大访问次数intvalue()default3;//默认时间窗口(秒)longduration()default60;} 2.创建拦截器处理频率逻辑@Slf4......
  • springboot 统计接口耗时及指定时间接口访问次数
     1.使用AOP在不改变原有方法的基础上对接口方法增强,引入依赖<!--引入AOP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--引入Redis依赖--><depen......
  • springboot项目找不到符号问题以及模块聚合项目maven插件使用的相关问题 问题如图
    参考:https://www.cnblogs.com/coderxiaobai/p/15005181.html问题:更换maven,清空缓存重新导入依赖依然无效后(1)解决方法:方式一:删除项目中.idea文件夹,重新打开项目,选中jdk版本,重新导入依赖即可。(2)如果不是上述的原因可能是项目是模块聚合项目,原因就是父工程的pom中存在maven插......
  • SpringBoot如何优雅的进行参数校验(一)
    SpringBoot如何优雅的进行参数校验一.为什么要进行参数校验在日常的开发过程中,我们常常需要对传入的参数进行校验,比如在web前后端分离项目中,参数校验有两个方面:前端进行参数校验后端进行参数校验那这两种有什么区别呢?只完成一个可不可以呢?答案是不可以的!......
  • SpringBoot的Cookie sameSite之坑
    https://blog.csdn.net/weixin_38296425/article/details/111941318 CSDN上很多文章给出了解决CookiesameSite坑跨域之坑的解决办法,但是都忽略了一个问题,没有给出相关的依赖,我也是费了不少劲终于找到了解决办法,在这里记录下来。例如下面的代码:@ConfigurationpublicclassT......
  • SpringBoot3使用自带日志组件Logback
    参考:https://blog.csdn.net/AIJXB/article/details/128602818pom.xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency>application.yaml配置l......
  • sh004基于springboot的MES生产制造执行系统【带LW文档】
    介绍基于springboot的MES生产制造执行系统管理员功能主要包括:生成计划管理、产品信息管理、销售订单管理、客户信息管理、物料信息管理、工业线路管理工序信息管理、员工管理、部门管理、个人中心等功能。员工功能结构图。其中员工查看工序信息,查看工艺线路,查看物料信息,查看产......