Java:SpringBoot整合Hashids,实现数据ID加密隐藏

引入依赖

<dependency><groupId>org.hashids</groupId><artifactId>hashids</artifactId><version>1.0.3</version>
</dependency>

步骤

1、自定义注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
public @interface JsonHashId {
}

1、定义序列化

public class HashIdLongSerializer extends JsonSerializer<Long> implements ContextualSerializer {@Overridepublic void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeString(HashIdUtil.encoded(value));}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider provider, BeanProperty property) throws JsonMappingException {JsonHashId annotation = property.getAnnotation(JsonHashId.class);if (annotation != null) {return this;} else{return new NumberSerializers.LongSerializer(Long.class);}}
}

3、定义反序列化

public class HashIdLongDeserializer extends JsonDeserializer<Long> implements ContextualDeserializer {@Overridepublic Long deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException, JacksonException {String value = jsonparser.getText();return HashIdUtil.decode(value);}@Overridepublic JsonDeserializer<?> createContextual(DeserializationContext context, BeanProperty property) throws JsonMappingException {JsonHashId annotation = property.getAnnotation(JsonHashId.class);if (annotation != null) {return this;} else {return new NumberDeserializers.LongDeserializer(Long.class, null);}}
}

4、添加自定义序列化器和反序列化器

public class JacksonObjectMapper extends ObjectMapper {public JacksonObjectMapper() {super();// 收到未知属性时不报异常this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);// 反序列化时,属性不存在的兼容处理this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);module..addDeserializer(Long.class, new HashIdLongDeserializer()).addSerializer(Long.class, new HashIdLongSerializer());// 注册功能模块 添加自定义序列化器和反序列化器this.registerModule(module);}
}

5、配置消息转换器

/*** 配置*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {/*** 扩展消息转换器** @param converters*/@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {// 创建消息转换器对象MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();// 设置对象转换器messageConverter.setObjectMapper(new JacksonObjectMapper());// 添加到mvc框架消息转换器中,优先使用自定义转换器converters.add(0, messageConverter);}
}

6、hashids工具类

package com.springboot.api.util;import org.hashids.Hashids;/*** hashid*/
public class HashIdUtil {public static Hashids getHashids() {return new Hashids("hashid", 8);}/*** 加密*/public static String encoded(Long id) {Hashids hashids = getHashids();return hashids.encode(id);}/*** 解密*/public static long decode(String uid) {Hashids hashids = getHashids();return hashids.decode(uid)[0];}
}

测试输出

userId: 1,加密后
"userId": "ZxWD0W68",

方式二

定义转换器,将序列化器和反序列化器写在一起


public class HashIdConverter {public static class HashIdLongDeserializer extends JsonDeserializer<Long> {@Overridepublic Long deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException, JacksonException {return HashIdUtil.decode(jsonparser.getText());}}public static class HashIdLongSerializer extends JsonSerializer<Long> {@Overridepublic void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeString(HashIdUtil.encoded(value));}}
}

配置内省器

public class HashIdFieldAnnotationIntrospector extends NopAnnotationIntrospector {@Overridepublic Object findSerializer(Annotated annotated) {TableId annotation = annotated.getAnnotation(TableId.class);if(annotation != null){return HashIdConverter.HashIdLongSerializer.class;} else{return super.findSerializer(annotated);}}@Overridepublic Object findDeserializer(Annotated annotated) {TableId annotation = annotated.getAnnotation(TableId.class);if(annotation != null){return HashIdConverter.HashIdLongDeserializer.class;} else{return super.findDeserializer(annotated);}}
}

配置

public class JacksonObjectMapper extends ObjectMapper {public JacksonObjectMapper() {super();// 将自定义注解內省器加入到Jackson注解内省器集合里,AnnotationIntrospector是双向链表结构AnnotationIntrospector annotationIntrospector = this.getSerializationConfig().getAnnotationIntrospector();AnnotationIntrospector pair = AnnotationIntrospectorPair.pair(annotationIntrospector, new HashIdFieldAnnotationIntrospector());this.setAnnotationIntrospector(pair);}
}

参考
SpringBoot中Jackson序列化处理自定义注解

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

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

相关文章

OpenHarmony—ArkTS限制throw语句中表达式的类型

规则&#xff1a;arkts-limited-throw 级别&#xff1a;错误 ArkTS只支持抛出Error类或其派生类的实例。禁止抛出其他类型&#xff08;例如number或string&#xff09;的数据。 TypeScript throw 4; throw ; throw new Error();ArkTS throw new Error();限制省略函数返回类…

el-tree实现多选、反选、指定选择

最近项目中遇到实现设备多选的需求&#xff0c;虽然这个需求很常见&#xff0c;但功能需求的不同&#xff0c;实现过程也大相径庭&#xff0c;我们的需求时只提供子级选择&#xff0c;父级不做选择&#xff0c;只提供层级显示&#xff1b; el-tree是elementPlus的组件&#xf…

Codeforces Round 835 (Div. 4)

目录 A. Medium Number B. Atilla’s Favorite Problem C. Advantage D. Challenging Valleys E. Binary Inversions F. Quests G. SlavicG’s Favorite Problem A. Medium Number 中位数,排序之后处于中间位置的数 void solve() {n3;vector<int> a(n);for(auto&a…

漏油检测时间大幅缩短!漏油传感器的检测原理是什么?

在油类化工厂、输油管道、油库等工业生产场所&#xff0c;漏油情况时有发生&#xff0c;如果不能及时发现&#xff0c;往往产生非常严重的后果。因此&#xff0c;由漏油控制器和漏油检测绳组合而成的漏油传感器被广泛应用了起来&#xff0c;能够在发生漏油时及时发出告警&#…

AHK学习,诡异的早起,舒畅地打篮球——2024 第4周总结

活神仙 引言颓 周六周日理清当前老问题新问题 总结当前之前的老问题 学习的AHKAHK历程AHK作用和适合人群 我帮别人解决的AHK例子我自用的AKH功能结尾 引言 今天才写周总结 是因为这两天有点颓 颓在哪里呢&#xff1f; 请听我细细说来 水文 技术有 AHK的&#xff0c;不想看可以…

【React教程】(1) React简介、React核心概念、React初始化

目录 ReactReact 介绍React 特点React 的发展历史React 与 Vue 的对比技术层面开发团队社区Native APP 开发 相关资源链接 EcmaScript 6 补充React 核心概念组件化虚拟 DOM 起步初始化及安装依赖Hello World React React 介绍 React 是一个用于构建用户界面的渐进式 JavaScrip…

Java-12.Spring 中通过 ThreadPoolTaskExecutor 和 AsyncConfigurerSupport 配置默认异步线程池

Java-12a.Spring 中通过 TaskDecorator 配置默认异步线程池 前言 虽然在 SpringBoot 2.7.x 中已经有关于异步线程池的默认配置&#xff0c;但如果还是要自定义的需求&#xff0c;仍然值得学习了解一下。 例如&#xff1a;想要在多线程池中添加 traceId&#xff1b;使用 tran…

【DC-DC】AP5125 降压恒流驱动器 60W LED电源驱动方案PCB+BOM表

这是一款60WLED驱动方案,线路图如下 ​ 祥单表&#xff1a; 实物图&#xff1a; 产品描述 特点应用领域应用原理图AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定…

APUE学习之进程间通信(IPC)(下篇)

目录 一、进程间通信&#xff08;IPC&#xff09; 二、信号量&#xff08;Semaphore&#xff09; 1、基本概念 2、同步关系与互斥关系 3、临界区与临界资源 4、信号量的工作原理 5、信号量编程 6、实战演练 三、共享内存&#xff08;Shared Memory&#xff09; 1、…

如何使用 Maltego 情报调查保姆级教程(附链接)

前言 使用软件需要挂梯子 一、介绍 Maltego 是一种开放源代码的情报和数据连接工具&#xff0c;专注于网络情报收集和图形化分析。它为用户提供了一个交互式的界面&#xff0c;用于收集、分析和可视化有关目标的信息。Maltego 被广泛用于网络侦查、威胁情报、渗透测试和安全…

Windows、Linux、Mac数据库的安装(mysql、MongoDB、Redis)

数据库的安装 作为数据存储的重要部分&#xff0c;数据库同样是必不可少的&#xff0c;数据库可以分为关系型数据库和非关系型数据库。 关系型数据库如 SQLite、MySQL、Oracle、SQL Server、DB2 等&#xff0c;其数据库是以表的形式存储&#xff1b;非关系型数据库如 MongoDB…

科普类——遥操作中的延时问题(二)

遥操作中的延时问题 遥操作中延时&#xff08;Latency&#xff09;问题是一个关键挑战&#xff0c;因为延时会导致操作员的指令不能及时传递给无人驾驶车辆&#xff0c;从而影响车辆的响应速度和安全性。为了解决或减轻延时问题&#xff0c;可以采取以下措施&#xff1a; 优化通…

我用Rust开发Rocketmq name server

我是蚂蚁背大象(Apache EventMesh PMC&Committer)&#xff0c;文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm&#xff0c;文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com 1. Rocketmq-rust namesrv概述 经过一个多月的开发&#xff0c;终…

【web安全】文件上传漏洞

upload-labs靶场 第一关 绕过前端 先打开哥斯拉&#xff0c;生成木马&#xff0c;选择php 打开brup开浏览器&#xff0c;上传文件&#xff0c;就会发现被阻止了&#xff0c;还没抓到包呢 那就是被前端代码阻止了&#xff0c;那通常前端代码都只能防御后缀名 我们抓到包后直…

php+Layui开发的网站信息探针查询源码

信息探针是一款基于layui开发的专业查询好友个人信息的程序。 自定义设置探针页面&#xff0c;探针功能&#xff0c;QQ分享&#xff0c;通知邮箱等功能。 生成页面链接好友点击会出现好友ip 位置信息&#xff0c;手机型号ua头浏览器等信息 gps需要注册百度地图开发者才可以使用…

盒子模型的内容总结

知识引入 1.认识盒子模型 在浏览网站时我们会发现内容都是按照区域划分的。这使得网页很工整、美观。在页面中&#xff0c;每一块区域分别承载不同的内容&#xff0c;使得网页的内容虽然零散&#xff0c;但是在版式排列上依然清晰有条理。如图1 图1 *承载内容的区域称为盒子…

镀锌板行业分析:我国市场消费量约为527万吨

镀锌板是指表面镀有一层锌的钢板。镀锌钢板为了防止钢板表面遭受腐蚀延长其使用寿命&#xff0c;会在钢板表面涂以一层金属锌&#xff0c;这种涂锌的钢板称为镀锌板。镀锌是一种经常采用的经济而有效的防锈方法&#xff0c;世界上锌产量的一半左右均用于此种工艺。 中国的迅…

数字护盾:深度探讨Sentinel的三大流控策略

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 数字护盾&#xff1a;深度探讨Sentinel的三大流控策略 前言快速失败策略&#xff1a;数字守卫的拦截术快速失败策略的基本原理&#xff1a;示例场景演示&#xff1a; Warm Up策略&#xff1a;数字城堡…

编程笔记 html5cssjs 067 JavaScrip String数据类型

编程笔记 html5&css&js 067 JavaScrip String数据类型 一、String数据类型二、类型运算三、代码示例小结 Javascript语言中的String数据类型详解。JavaScript 中的 String 数据类型用于表示文本数据。字符串是不可变的&#xff0c;这意味着一旦创建了一个字符串&#x…

如何安装配置HFS并实现无公网ip远程访问本地电脑共享文件

文章目录 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留隧道2.2 隧道名称2.3 成功使用cpolar创建二级子域名访问本地hfs 总结 前言 在大厂的云存储产品热度下降后&#xff0c;私人的NAS热度快速上升&#xff0c;其中最…