当前位置: 首页 > news >正文

【三十三】springboot+序列化实现返回值脱敏和返回值字符串时间格式化问题

互相交流入口地址

整体目录:

【一】springboot整合swagger

【二】springboot整合自定义swagger

【三】springboot整合token

【四】springboot整合mybatis-plus

【五】springboot整合mybatis-plus

【六】springboot整合redis

【七】springboot整合AOP实现日志操作

【八】springboot整合定时任务

【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存

【十】springboot整合quartz实现定时任务优化

【十一】springboot整合异步调用并获取返回值

【十二】springboot整合WebService

【十三】springboot整合WebService关于传参数

【十四】springboot整合WebSocket

【十五】springboot整合WebSocket实现聊天室

【十六】RabbitMQ基础篇(下载安装并基础使用,内含各种坑问题)

【十七】RabbitMQ基础篇(延迟队列和死信队列实战)

【十八】springboot实现自定义全局异常处理

【十九】初学Kafka并实战整合SpringCloudStream进行使用

【二十】springboot整合ElasticSearch实战(万字篇)

【二十一】springboot整合过滤器实战

【二十二】springboot整合拦截器实战并对比过滤器

【二十三】springboot整合activiti7(1)实战演示篇

【二十四】springboot整合spring事务详解以及实战

【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十六】springboot整合jedis和redisson布隆过滤器处理缓存穿透

【二十七】springboot实现多线程事务处理

【二十八】springboot之threadLocal参数解析器实现session一样保存当前登录功能 

【二十九】springboot整合logback实现日志管理

【三十】springboot项目上高并发解决示例

【三十一】springboot+easyExcel实现多文件导出压缩包

目录

一、返回值脱敏

二、返回值日期格式化 


        很久没有写小作文了,赶着学子们参加考试的时间,继续记录点小东西,1、返回对象的字符串数据脱敏 ;2、返回对象针对字符串格式的时间的格式化。

一、返回值脱敏

        1、准备返回值对象

       2、准备接口

        3、准备脱敏注解

        4、准备序列化处理类
public class SensitiveInfoSerialize extends JsonSerializer<String> implements ContextualSerializer {private DesensitizationType type;public SensitiveInfoSerialize() {}public SensitiveInfoSerialize(final DesensitizationType type) {this.type = type;}@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {switch (this.type) {case ID_CARD:value = DesensitizedUtil.idCardNum(value, 4, 2);break;case MOBILE_PHONE: {value = DesensitizedUtil.mobilePhone(value);break;}default:break;}gen.writeString(value);}/*** 序列化时获取字段注解属性* @param serializerProvider* @param property* @return* @throws JsonMappingException*/@Overridepublic JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty property) throws JsonMappingException {if (property != null) {// 此demo只处理String类型字段if (Objects.equals(property.getType().getRawClass(), String.class)) {SensitiveInfo sensitiveInfo = property.getAnnotation(SensitiveInfo.class);if (sensitiveInfo == null) {sensitiveInfo = property.getContextAnnotation(SensitiveInfo.class);}if (sensitiveInfo != null) {return new SensitiveInfoSerialize(sensitiveInfo.value());}}return serializerProvider.findValueSerializer(property.getType(), property);}return serializerProvider.findNullValueSerializer(null);}}

        实现ContextualSerializer接口后重写的JsonSerializer方法就是为了找到需要处理的属性,而集成JsonSerializer后重写的serialize方法就是为了处理需要处理的属性。DesensitizedUtil是糊涂的工具。就这样就可以了。

        5、演示原本效果

        6、增加注解后效果

二、返回值日期格式化 

        在开发时返回值里的时间一定不只是Date、LocalDateTime、LocalDate,有时候也可能是字符串格式。此时常用的@JsonFormat注解就失去用武之地了,使用上面的方式也可以处理这种情况,下面进行展示。

        1、返回值增加时间字段

        2、原有效果

        3、使用常用的@JsonFormat注解进行处理

        处理字符串的时间以外,其他的时间都能正常处理,下面通过序列化的方式进行处理该字段。

         4、增加字符串日期格式处理注解

        5、准备序列化处理类
public class StringToDateSerialize extends JsonSerializer<String> implements ContextualSerializer {private String sourceFormat;private String targetFormat;public StringToDateSerialize() {}public StringToDateSerialize(final String sourceFormat, final String targetFormat) {this.sourceFormat = sourceFormat;this.targetFormat = targetFormat;}@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeString(DateUtil.format(DateUtil.parse(value,sourceFormat), targetFormat));}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty property) throws JsonMappingException {if (property != null) {if (Objects.equals(property.getType().getRawClass(), String.class)) {StringToDate stringToDate = property.getAnnotation(StringToDate.class);if (stringToDate == null) {stringToDate = property.getContextAnnotation(StringToDate.class);}if (stringToDate != null) {return new StringToDateSerialize(stringToDate.source(),stringToDate.target());}}return serializerProvider.findValueSerializer(property.getType(), property);}return serializerProvider.findNullValueSerializer(null);}}
        6、测试效果

        可看到字符串格式的时间,包括含有T的时间格式都能够成功处理。

        欢迎大佬们评论区讨论。 

相关文章:

  • 【python报错】list indices must be integers or slices, not tuple
  • 数学+思维,CF1056B - Divide Candies
  • 网络安全快速入门(十五)(下)手动创建用户及su,sudo命令
  • 简单使用phpqrcode 生成二维码图片
  • 代码随想录算法训练营第36期DAY50
  • Docker 进入指定容器内部(以Mysql为例)
  • 详解linux设备下的/dev/null
  • 微信小程序怎么进行页面传参
  • 大学数字媒体艺术设计网页设计试题及答案,分享几个实用搜题和学习工具 #媒体#职场发展
  • 12寸晶圆厂建设概述
  • Javascript全解(基础篇)
  • C语言详解(动态内存管理)2
  • Nvidia Jetson/Orin/算能 +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶
  • idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法
  • go语言实战--基于Vue3+gin框架的实战Cetide网项目(讲解开发过程中的各种踩坑)
  • avalon2.2的VM生成过程
  • create-react-app做的留言板
  • Django 博客开发教程 8 - 博客文章详情页
  • ECS应用管理最佳实践
  • GraphQL学习过程应该是这样的
  • isset在php5.6-和php7.0+的一些差异
  • Javascript 原型链
  • Linux CTF 逆向入门
  • Odoo domain写法及运用
  • PHP的Ev教程三(Periodic watcher)
  • React16时代,该用什么姿势写 React ?
  • ReactNativeweexDeviceOne对比
  • Web设计流程优化:网页效果图设计新思路
  • 多线程 start 和 run 方法到底有什么区别?
  • 如何利用MongoDB打造TOP榜小程序
  • 手写双向链表LinkedList的几个常用功能
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 译自由幺半群
  • ionic入门之数据绑定显示-1
  • 进程与线程(三)——进程/线程间通信
  • $(selector).each()和$.each()的区别
  • $L^p$ 调和函数恒为零
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (undone) MIT6.824 Lecture1 笔记
  • (第27天)Oracle 数据泵转换分区表
  • (二)测试工具
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (生成器)yield与(迭代器)generator
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • ***通过什么方式***网吧
  • ..回顾17,展望18
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net CF下精确的计时器
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net Core 微服务之Consul(二)-集群搭建
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式