SpringBoot利用自定义json序列化器实现敏感字段数据脱敏详解

 更新时间:2024年01月26日 10:13:23   作者:ThinkPet  
这篇文章主要介绍了SpringBoot利用自定义json序列化器实现敏感字段数据脱敏详解,因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖,如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖,需要的朋友可以参考下

引入hutool依赖

因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖。

如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.8</version>
</dependency>

自定义jackson序列化器

自定义一个手机号脱敏序列化器

package com.example.demo.plugin;
import cn.hutool.core.util.DesensitizedUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Slf4j
@Component
public class MobileMskJsonSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String s,
                          JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException {
        String s1 = DesensitizedUtil.mobilePhone(s);
        log.info("mobilePhone数据:{}脱敏后的值是:{}",s,s1);
        jsonGenerator.writeString(s1);
    }
}

自定义一个邮箱脱敏序列化器

package com.example.demo.plugin;
import cn.hutool.core.util.DesensitizedUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Slf4j
@Component
public class MailMskJsonSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String s1 = DesensitizedUtil.email(s);
        log.info("email数据:{}脱敏后的值是:{}",s,s1);
        jsonGenerator.writeString(s1);
    }
}

注册刚刚自定义的json序列化器

package com.example.demo.plugin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonCfg {
    @Autowired
    private MobileMskJsonSerializer  mobileMskJsonSerializer;
    @Autowired
    private MailMskJsonSerializer mailMskJsonSerializer;
    /**
     * 可以同时注册多个自定义的jackson 序列化器
     * @return
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer objectMapperBuilderCustomizer(){
        return builder -> {
            builder.serializerByType(String.class,mobileMskJsonSerializer);
            builder.serializerByType(String.class,mailMskJsonSerializer);
        };
    }
}

测试@JsonSerialize效果

在实体类中使用@JsonSerialize注解

package com.example.demo.orm.po;
import cn.hutool.core.util.DesensitizedUtil;
import com.example.demo.plugin.MailMskJsonSerializer;
import com.example.demo.plugin.MobileMskJsonSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Account implements Serializable {
    private static final long serialVersionUID = -8114863398578320034L;
    private Integer id;
    private String username;
    // @JsonSerialize 既可以用在字段上 ,也可以用在类上
    // 用在字段上时,只对某个字段生效
    // 用在类上时,对类中所有字段生效.(优先级更高)
    // 一般常用在 字段上,对某个字段做特殊的序列化处理
    //使用 手机号脱敏序列号器
    @JsonSerialize(using = MobileMskJsonSerializer.class)
    private String mobile;
    //使用 邮箱脱敏序列号器
    @JsonSerialize(using = MailMskJsonSerializer.class)
    private String mail;
}

测试查询结果

@Test
void test81902() throws JsonProcessingException {
        Account oneById = accountMapper.findOneById(17);
        System.err.println(oneById);
        //使用jackson 序列化java对象
        ObjectMapper objectMapper = new ObjectMapper();
        String msk = objectMapper.writerWithDefaultPrettyPrinter()
                .writeValueAsString(oneById);
        System.err.println(msk);
 }

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7135ce0a]
Account(id=17, username=ert, mobile=13273629312, mail=kew5612@163.com)
2023-07-05 20:28:38.536  INFO 17952 --- [           main] c.e.demo.plugin.MobileMskJsonSerializer  : mobilePhone数据:13273629312脱敏后的值是:132****9312
2023-07-05 20:28:38.537  INFO 17952 --- [           main] c.e.demo.plugin.MailMskJsonSerializer    : email数据:kew5612@163.com脱敏后的值是:k******@163.com
{
  "id" : 17,
  "username" : "ert",
  "mobile" : "132****9312",
  "mail" : "k******@163.com"
}

到此这篇关于SpringBoot利用自定义json序列化器实现敏感字段数据脱敏详解的文章就介绍到这了,更多相关SpringBoot敏感字段数据脱敏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于SpringBoot整合RabbitMQ实现死信队列

    关于SpringBoot整合RabbitMQ实现死信队列

    这篇文章主要介绍了关于SpringBoot整合RabbitMQ实现死信队列,死信队列实际上就是一个普通的队列,只是这个队列跟死信交换机进行了绑定,用来存放死信而已,需要的朋友可以参考下
    2023-05-05
  • SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解

    SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解

    延迟初始化(Lazy Initialization)是一种在需要时才创建或加载对象的策略,以减少启动时间和资源消耗,本文就来讲讲延迟初始化的具体使用吧
    2023-05-05
  • Security中的WebSecurityConfigurerAdapter详解

    Security中的WebSecurityConfigurerAdapter详解

    这篇文章主要介绍了Security中的WebSecurityConfigurerAdapter详解,今天我们要进一步的的学习如何自定义配置Spring Security,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • springmvc实现文件上传功能

    springmvc实现文件上传功能

    这篇文章主要为大家详细介绍了springmvc实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • JavaWeb Session 会话管理实例详解

    JavaWeb Session 会话管理实例详解

    这篇文章主要介绍了JavaWeb Session 会话管理的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • Java日常练习题,每天进步一点点(30)

    Java日常练习题,每天进步一点点(30)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • 如何用Dos命令运行Java版HelloWorld你知道吗

    如何用Dos命令运行Java版HelloWorld你知道吗

    这篇文章主要介绍了在dos窗口中编译和运行java文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Java Agents代理是什么

    Java Agents代理是什么

    Java代理Agents通过提供使我们能够侵入JVM中正在运行的Java程序的服务,在最底层工作。Java的这一强大但不可思议的部分具有在错误操作时使JVM崩溃的能力。本文简要介绍了这个概念,并介绍了它的工作原理。需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • Spring的BeanUtils.copyProperties属性复制避坑指南

    Spring的BeanUtils.copyProperties属性复制避坑指南

    这篇文章主要介绍了Spring的BeanUtils.copyProperties属性复制避坑指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringBoot项目的多文件兼多线程上传下载

    SpringBoot项目的多文件兼多线程上传下载

    本文主要介绍了SpringBoot项目的多文件兼多线程上传下载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论