news 2026/5/8 21:40:08

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/5/8 13:18:13

Python爬虫实战:基于异步技术的大宗商品期货交易数据爬取与趋势分析

引言:期货数据爬虫的重要性与挑战 在当今数字化金融时代,期货市场交易数据已成为投资者、分析师和研究人员进行大宗商品价格趋势分析的关键资源。期货数据不仅反映了市场供需关系,还包含了宏观经济、政策变化和全球事件的影响。然而,获取高质量、实时的期货交易数据面临着…

作者头像 李华
网站建设 2026/5/8 1:00:16

46、Linux使用指南:从基础到高级的全面攻略

Linux使用指南:从基础到高级的全面攻略 一、Linux基础概念 1.1 “Free”的含义 在特定语境中,“free”指的是自由或自主,而非价格层面的免费。这种区别在相关介绍中会有详细解释。 1.2 Unix的起源 “Unix”最初写作“Unics”,代表“Uniplex Information and Computing…

作者头像 李华
网站建设 2026/4/30 11:01:39

LobeChat能否用于生成广告语?品牌传播创意工厂

LobeChat能否用于生成广告语&#xff1f;品牌传播创意工厂 在品牌营销的战场上&#xff0c;一句精准有力的广告语&#xff0c;往往能撬动千万级的市场认知。然而&#xff0c;传统创意流程依赖少数“天才文案”&#xff0c;不仅成本高昂&#xff0c;且难以规模化响应快速变化的消…

作者头像 李华
网站建设 2026/5/5 10:52:29

Windows下TensorFlow 2.5 GPU环境配置指南

Windows下TensorFlow 2.5 GPU环境配置实战指南 在深度学习项目中&#xff0c;训练一个大型模型动辄需要数小时甚至几天。如果你还在用CPU跑TensorFlow&#xff0c;那可能连“调参侠”的门槛都还没迈进去——等你调完一组超参数&#xff0c;别人已经跑完三轮实验了。 真正高效…

作者头像 李华
网站建设 2026/5/2 2:09:22

一键 i18n 国际化神库!适配 Vue、React!

一键 i18n 国际化神库&#xff01;适配 Vue、React&#xff01; 作为一名前端开发&#xff0c;给项目做多语言早已是家常便饭。 可每次面对成百上千条文案&#xff0c;“一行行手动翻译 维护 N 个 JSON 文件”仍然是让人头秃的体力活。 今天就把我实测有效的 3 款零入侵、一…

作者头像 李华
网站建设 2026/5/2 22:15:41

LobeChat能否用于创建商业模式画布?创业项目策划助手

LobeChat&#xff1a;打造你的AI创业策划助手 在今天这个“人人都是产品经理”的时代&#xff0c;一个绝妙的创意可能诞生于咖啡馆的一次闲聊&#xff0c;也可能来自深夜灵光乍现的备忘录。但真正让想法落地的&#xff0c;不是灵感本身&#xff0c;而是如何快速、系统地把它转化…

作者头像 李华