news 2026/9/21 10:33:45

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/9/21 8:23:42

38、Linux 邮件与网页浏览实用指南

Linux 邮件与网页浏览实用指南 在 Linux 系统中,邮件管理和网页浏览是日常使用中非常重要的功能。下面将详细介绍相关的工具和操作方法。 邮件管理 查看邮件文件夹 可以使用 less 查看邮件文件夹,也能在文本编辑器中编辑。不过,文件夹会显示为一个包含所有邮件的长滚动…

作者头像 李华
网站建设 2026/9/21 18:49:37

41、互联网服务实用指南

互联网服务实用指南 在互联网的使用过程中,我们常常会涉及到文件传输、新闻阅读、系统和用户活动查询以及消息发送等操作。下面将为大家详细介绍这些操作的相关知识和具体方法。 1. 文件传输 在进行文件传输时,FTP(文件传输协议)是常用的工具。默认情况下,本地系统的当…

作者头像 李华
网站建设 2026/9/22 1:38:33

LLaMA-Factory微调与模型中断续训实战

LLaMA-Factory微调与模型中断续训实战 在大语言模型&#xff08;LLM&#xff09;日益渗透到企业服务、智能客服和垂直领域应用的今天&#xff0c;如何高效地对开源模型进行定制化训练&#xff0c;已成为开发者构建专属AI能力的关键一步。面对动辄数十GB的模型参数和复杂的分布…

作者头像 李华
网站建设 2026/9/22 0:40:50

GitHub项目实践:Fork并定制你的个性化Anything-LLM前端界面

GitHub项目实践&#xff1a;Fork并定制你的个性化Anything-LLM前端界面 在智能应用开发的浪潮中&#xff0c;如何让大语言模型&#xff08;LLM&#xff09;走出命令行、真正融入用户的日常操作体验&#xff1f;这不仅是技术挑战&#xff0c;更是产品思维的跃迁。一个直观、流畅…

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

pythonstudy Day37

MLP神经网络的训练 PyTorch的安装 我们后续完成深度学习项目中&#xff0c;主要使用的包为pytorch&#xff0c;所以需要安装&#xff0c;你需要去配置一个新的环境。 未来在复现具体项目时候&#xff0c;新环境命名最好是python版本_pytorch版本_cuda版本&#xff0c;例如 p…

作者头像 李华
网站建设 2026/9/21 10:19:43

Linly-Talker结合RAG技术实现知识增强型虚拟客服系统

Linly-Talker结合RAG技术实现知识增强型虚拟客服系统 在银行的智能柜台前&#xff0c;一位老人轻声问&#xff1a;“我这个月养老金涨了多少&#xff1f;”屏幕中的虚拟柜员微微一笑&#xff0c;眼神温和地回应&#xff1a;“根据您所在城市的最新政策&#xff0c;2024年起基础…

作者头像 李华