自定义注解进行数据脱敏

news/2024/12/27 4:12:16/文章来源:https://www.cnblogs.com/songweipeng/p/18548072

前言

有些时候,我们可能对输出的某些字段要做特殊的处理在输出到前端,比如:身份证号,电话等信息,在前端展示的时候我们需要进行脱敏处理,这时候通过自定义注解就非常的有用了。在Jackson中要自定义注解,我们可以通过@JacksonAnnotationsInside注解来实现,如下示例:

一、自定义注解

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 = SensitiveSerializer.class)
public @interface Sensitive {//加密开始位置int start()default 0 ;//加密结束位置int end() default 0 ;//加密掩码String mask() default "*" ;
}

二、自定义序列化处理器SensitiveSerializer

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 org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.Collections;/*** @author songwp* @date 2024-11-15* @desc 自定义序列化器,用于对敏感字段进行脱敏处理*/
public class SensitiveSerializer extends JsonSerializer<String> implements ContextualSerializer {private Sensitive sensitive;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {String val = value;if (sensitive != null && StringUtils.hasLength(val)) {String m = sensitive.mask();int start = sensitive.start();int end = sensitive.end();int totalLength = value.length();if (totalLength <= 2) {val = totalLength == 1 ? value + m : value.substring(0, 1) + m;} else if (totalLength <= 6) {val = value.substring(0, 1) + String.join("", Collections.nCopies(totalLength - 2, m)) + value.substring(totalLength - 1);} else {int prefixLength = Math.min(start, totalLength - 1);int suffixLength = Math.min(end, totalLength - 1);if (prefixLength > totalLength) {prefixLength = totalLength / 2;}if (suffixLength > totalLength) {suffixLength = totalLength / 2;}int maskLength = Math.max(0, totalLength - (prefixLength + suffixLength));if (maskLength == 0) {prefixLength -= 2;suffixLength -= 2;maskLength = Math.max(2, totalLength - (prefixLength + suffixLength));}prefixLength = Math.min(prefixLength, totalLength - 1);suffixLength = Math.min(suffixLength, totalLength - 1);maskLength = totalLength - prefixLength - suffixLength;val = value.substring(0, prefixLength) + String.join("", Collections.nCopies(maskLength, m)) + value.substring(totalLength - suffixLength);}}gen.writeString(val);}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {sensitive = property.getAnnotation(Sensitive.class);return this;}
}

三、在输出的Java Bean中使用上面的注解

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.songwp.config.Sensitive;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;/*** @author songwp* @version 1.0* @date 2024-11-15* @description: user domain*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {@JsonSerialize(using = ToStringSerializer.class)private Long id;@Sensitive(start = 2, end = 4)private String name;@Sensitive(start = 6, end = 4)private String idCard;@Sensitive(start = 4, end = 3)private String phone;
}

四、在前端展示结果如下:

 敏感数据得到了脱敏处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openVAS安装记

项目需要使用openVAS 安装步骤 我这里使用的是Ubuntu最新版,因为Ubuntu和debian可通过官网仓库进行安装,因改名为gvm 后续直接上操作 #安装 sudo apt install gvm -y #初始化(可能时间比较长,台会去下载数据库) sudo gvm-setup# 开机自启服务 sudo systemctl enable notus-…

爆火的外卖霸王餐项目,怎么做?

微客云以下是一些做爆火的外卖霸王餐项目的方法: ### 明确项目定位与目标- **确定核心目标**:明确是为了增加新用户、提高复购率、提升品牌知名度还是收集用户反馈等,不同目标决定后续策略 。- **精准定位用户群体**:了解目标用户的消费习惯、喜好、需求及消费能力等,如上…

轮廓线DP

讲解轮廓线DP的两种常见形式以及例题。更新日志概念 类似于状态压缩DP,但我们储存的是轮廓线上的状态。 有些时候,也不需要进行状态压缩,而可以用某一点的状态代表一个区域的状态。 思路 轮廓线就是已经决策的与尚未决策的部分的分界线,我们储存分界线上已经决策过的所有节…

Nuxt.js 应用中的 schema:written 事件钩子详解

title: Nuxt.js 应用中的 schema:written 事件钩子详解 date: 2024/11/15 updated: 2024/11/15 author: cmdragon excerpt: schema:written 钩子是 Vite 提供的一种生命周期钩子,在模式写入完成后调用。通过这个钩子,开发者可以在配置被正式应用之后执行一些后续操作,比如记…

概率与期望基础

实验、结果、样本空间、事件 事件 \(A\) 是否发生取决于一系列影响它的因素,这些因素影响 \(A\) 的过程称为一次 experiment 实验 或 trial 试验 一次试验的 result 结果 称为它的 outcome 结局。\(\text{result}\) 指由原因所引起的结果 \(\text{outcome}\) 强调事件特有的结…

4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明

4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明 @目录4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明前言1. Ribbon 介绍1.1 LB(Load Balance 负载均衡)2. Ribbon 原理2.2 Ribbon 机制3. Spring Cloud Ribbon 实现负载均衡算法-应用实例4. 总结:5. 最后:前…

WSL2的介绍和使用

WSL2的介绍和使用 一、什么是WSL2? WSL是Windows Subsystem for Linux的简称,它是微软为Win10和Win11引入的一项功能。WSL允许用户在Windows上运行Linux操作系统及其相关命令和应用程序,而无需使用虚拟机或安装双系统。 1.1 WSL2与WSL1、传统虚拟机比较WSL1:没有完整的Linu…

插件大总结

加注释插件搜索接口插件mybatis-plus插件

Windows系统日志报错:生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS协议所定义的严重错误代码是10。Windows SChannel错误状态是1203是怎么回事?

当我们检查Windows系统日志发现有一个报错:生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS协议所定义的严重错误代码是10。Windows SChannel错误状态是1203。导致报错的原因是什么?该如何处理?驰网飞飞和你分享当我们检查Windows系统日志发现有一个报错:…

Windows三种提权实验

以win7为例手动提权 上线 将一句话木马上传到win7当中,本地使用蚁剑进行链接。信息收集 systeminfo查询杀软信息 wmic process list briefWindows杀软在线查询无匹配杀软进程。 根据系统信息和杀软信息查询提权EXP Windows 提权辅助 | 在线安全工具以列出的微软编号MS17-017为…

量化训练及精度调优经验分享

本文提纲:fx 和 eager 两种量化训练方式介绍 量化训练的流程介绍:以 mmdet 的 yolov3 为例 常用的精度调优 debug 工具介绍 案例分析:模型精度调优经验分享第一部分:fx 和 eager 两种量化训练方式介绍 首先介绍一下量化训练的原理。上图为单个神经元的计算,计算形式是加权…

Tomcat Windows 服务 JVM 内存参数设置

Tomcat 在 Windows 平台上启动服务的方式是 Commons Daemon,JVM 的启动参数可以有多种设置方法。本文介绍 Commons Daemon 的大致组成和参数设置方法。 Commons Daemon 由两部分组成。 一是由 C 语言开发负责和操作系统交互的平台相关程序,在 Windows 上平台相关部分是 procr…