news 2026/6/10 18:49:22

Java 安全的打印对象数据到日志

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 安全的打印对象数据到日志
  • 在开发中有时候需要打印一些对象的属性值, 但是其中含有一些敏感字段, 不能打印明文而是需要脱敏打印,写了一个工具, 可以将对象转换成JSON字符串,并且可以指定要脱敏的字段名称
packagecom.visy.utils;importcn.hutool.core.util.ObjectUtil;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importcom.alibaba.fastjson.serializer.SerializerFeature;importjava.util.Arrays;publicclassLogUtil{/** * 安全的JSON字符串转换(可脱敏) * @param obj 待序列化对象 * @param fieldNames 待脱敏的字段名称 * @return JSON字符串 */publicstaticStringtoJsonSafety(Objectobj,String...fieldNames){if(fieldNames==null||fieldNames.length==0){returntoJson(obj);}JSONObjectjsonObject=(JSONObject)JSON.toJSON(obj);for(StringfieldName:fieldNames){Objectvalue=jsonObject.get(fieldName);if(ObjectUtil.isNotNull(value)){jsonObject.put(fieldName,mask(value.toString()));}}returntoJson(jsonObject);}privatestaticStringtoJson(Objectobj){returnJSON.toJSONString(obj,SerializerFeature.WriteMapNullValue);}/** * 字符串脱敏方法(自动计算并隐藏部分字符) * @param value 待脱敏的字符串 * @return 脱敏后的字符串 */publicstaticStringmask(Stringvalue){if(value==null||value.isEmpty()){returnvalue;}intlength=value.length(),halfLength=length/2;if(halfLength<=1){// 1 ~ 3 个字符, 全部脱敏returncreateRepeatedString('*',length);}else{// >= 4 个字符, 前后各保留1/4 个字符intbeforeLength=halfLength/2;returnmask(value,'*',beforeLength,halfLength-beforeLength);}}/** * 数据脱敏方法 * @param value 待脱敏的原始数据 * @param ch 脱敏占位字符 * @param beforeLength 前保留字符数 * @param afterLength 后保留字符数 * @return 脱敏后的数据 */publicstaticStringmask(Stringvalue,charch,intbeforeLength,intafterLength){// 空值安全检查if(value==null||value.isEmpty()){returnvalue;}finalintlength=value.length(),leastLength=beforeLength+afterLength;// 长度小于等于leastLength位,全部脱敏if(length<=leastLength){if(length<=afterLength){// 剩余长度小于等于afterLength,全部脱敏returncreateRepeatedString(ch,length);}// 剩余长度大于afterLength,只脱敏前length-afterLength位returncreateRepeatedString(ch,length-afterLength)+value.substring(length-afterLength);}returnvalue.substring(0,beforeLength)+createRepeatedString(ch,length-leastLength)+value.substring(length-afterLength);}/** * 创建重复字符的字符串 * @param ch 要重复的字符 * @param count 重复次数 * @return 重复字符组成的字符串 */privatestaticStringcreateRepeatedString(charch,intcount){if(count<=0){return"";}char[]chars=newchar[count];Arrays.fill(chars,ch);returnnewString(chars);}}
  • 使用
publicclassLogUtilTest{publicstaticvoidmain(String[]args){Useruser=newUser();user.setName("张三");user.setAge(22);user.setIdCard("320381198812252138");//打印结果:{"idCard":"3203*********52138","name":"张三","age":22}System.out.println(LogUtil.toJsonSafety(user,"idCard"));}@DatastaticclassUser{privateStringname;privateIntegerage;privateStringidCard;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:32:09

35、Linux实用技巧:日程管理、联系人管理与数学计算

Linux实用技巧:日程管理、联系人管理与数学计算 在Linux系统中,有许多实用的工具可以帮助我们更高效地管理日程、联系人,以及进行数学计算。下面将详细介绍这些工具的使用方法。 日程管理 1. 日程文件格式 在Linux中,可以使用特定的格式在日程文件中记录安排。可以用缩…

作者头像 李华
网站建设 2026/6/9 16:30:14

混合精度训练BN层不稳定 后来才知道强制FP32计算

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 目录我和AI相爱相杀的2025年 一、AI创业的“真人模式”&#xff1a;我差点成了人形AI 二、AI工具&#xff1a;从“效率神器”到“职场诅咒” 三、AI生活的甜蜜陷阱 1. 智能家居&#xf…

作者头像 李华
网站建设 2026/6/10 14:25:32

机房预约系统

机房预约系统.cpp#include<iostream> #include<fstream> #include<string> #include"globalFile.h" #include"identity.h" #include"student.h" #include"teacher.h" #include"manager.h"using namespace…

作者头像 李华
网站建设 2026/6/10 14:32:09

六边形架构补充 - 第五章 - DDD领域模型

六边形架构 六边形架构的由基础设施层、用户接口层、应用层和领域层组成。领域层封装核心的业务逻辑&#xff0c;然后由应用层进行业务逻辑的编排。接口层和基础设置层在六边形架构中分别属于输入端口和输出端口&#xff0c;然后在进行端口的适配。领域层&#xff1a; 位于最底…

作者头像 李华
网站建设 2026/6/9 21:31:13

RocketMQ 网络性能调优:TCP 参数配置、连接池优化与延迟降低技巧

在高并发、低延迟的业务场景中&#xff0c;RocketMQ 的网络性能直接决定了消息传递的效率与稳定性。无论是峰值流量下的消息堆积&#xff0c;还是关键业务的延迟敏感需求&#xff0c;都需要从网络底层入手&#xff0c;通过 TCP 参数优化、连接池精细化配置以及针对性的延迟降低…

作者头像 李华
网站建设 2026/6/10 16:13:33

Facefusion输出视频不显示?检查路径中文问题

FaceFusion输出视频不显示&#xff1f;先查路径有没有中文 你有没有遇到过这种情况&#xff1a;FaceFusion 界面明明提示“处理完成”&#xff0c;进度条也走到底了&#xff0c;结果打开输出文件夹一看——空的。没有报错&#xff0c;没有崩溃&#xff0c;甚至连日志都风平浪静…

作者头像 李华