【SpringSecurity】【JJWT】JJWT踩坑LocalDateTime

前言

最近自己又在开始闲搞,主要原因还是下山无望(买显卡)。只能晚上下班找点事情做啦~~

环境

版本请根据实际情况参考JJWT官网选择使用,这里只说明一下问题大概思路!

<!-- 增加token生成依赖 -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.4</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><scope>runtime</scope><version>0.11.4</version>
</dependency>
<!-- 该依赖根据当前项目json解析器选择: 如果选择gson 则引入 jjwt-gson -->
<!-- 需要自定义序列化器, 需注释掉runtime域 -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.4</version>
<!--<scope>runtime</scope>-->
</dependency>

问题

最近在重新学习SpringSecurity + JJWT完成整体令牌… 然后就遇到了下面的问题…

简单描述下,问题的根本就是JJWT源码中会寻找当前项目默认使用 ‘JacksonSerializer’ ,源码贴出来看一下,可以看出来如果没有通过构造方法传入一个新的ObjectMapper时,默认使用最基本的对象来进行序列化操作。而默认new出来最基本的序列化对象,是不支持序列化LocalDateTime的。

JJWT中JacksonSerializer源码:

    static final ObjectMapper DEFAULT_OBJECT_MAPPER = new ObjectMapper();private final ObjectMapper objectMapper;@SuppressWarnings("unused") //used via reflection by RuntimeClasspathDeserializerLocatorpublic JacksonSerializer() {this(DEFAULT_OBJECT_MAPPER);}@SuppressWarnings("WeakerAccess") //intended for end-users to use when providing a custom ObjectMapperpublic JacksonSerializer(ObjectMapper objectMapper) {Assert.notNull(objectMapper, "ObjectMapper cannot be null.");this.objectMapper = objectMapper;} ```

错误结果在这里插入图片描述

解决办法

解决问题首先思路肯定是从源码出发,我们从源码中可以看出来,JJWT已经为我们预留了重写默认ObjectMapper的方式了,既然这样最简单的解决方式就是利用 ‘JacksonSerializer’ 中的有参构造来覆写入支持序列化 ‘LocalDateTime’ 的ObjectMapper就可以了.
在这里插入图片描述
当然接下来肯定有人要问了,这个构造方法应该在什么时候调用呢?

别着急嘛,正要说到这里~~

JJWT目前提供的计算令牌的方式是通过 ‘Jwts’ 类来进行链式调用完成令牌计算,解析的。
示例如下:

// 获取令牌
Jwts.builder().setClaims(claims).signWith(secretKey(secret)).compact();
// 解析令牌
Jwts.parserBuilder().setSigningKey(secretKey(secret)).build().parseClaimsJws(token).getBody();

既然知道这个类主要提供给我们用来操作的,那我们就可以在类中查找一下是否提供了序列化的方法。(最好还是先查看文档哦,避免盲目寻找浪费时间,这里我就直接贴出来官方的翻译(仅供参考 ))

自定义 JSON 处理器
如果您不想使用 JJWT 的运行时依赖方式,或者只是想自定义 JSON 序列化和反序列化的工作方式,则可以实现 Serializer 和 Deserializer 接口,并分别在 JwtBuilder 和 JwtParserBuilder 上指定它们的实例。例如:

When creating a JWT(创建JWT时):

//implement meJwts.builder().serializeToJsonWith(serializer)// ... etc ... ```

When reading a JWT(读取 JWT 时):

getMyDeserializer(); //implement meJwts.parserBuilder().deserializeJsonWith(deserializer)// ... etc ... ```

w(゚Д゚)w 看完文档是不是豁然开朗,接下来只需要将自定义可以序列化万物的 serializer 交出来就可以了~

// PS. 这是两个分开的方法哦 记住了吗~
Jwts.builder()// 使用项目配置的json序列化器.serializeToJsonWith(new JacksonSerializer<>(JsonUtil.MAPPER)).setClaims(claims).signWith(secretKey(secret)).compact();
// ----------------------------------
Jwts.parserBuilder().deserializeJsonWith(new JacksonDeserializer<>(JsonUtil.MAPPER)).setSigningKey(secretKey(secret)).build().parseClaimsJws(token).getBody();

测试验证结果

在这里插入图片描述
؏؏☝ᖗ乛◡乛ᖘ☝؏؏

验证通过,完结撒花~

对了,还有配置ObjectMapper LocalDateTime序列化器的方法我就不单独贴出来了,有很多现成的,可以度娘自行获取 ┏(^0^)┛

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

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

相关文章

针对Linux ASP.NET MVC网站中 httpHandlers配置无效的解决方案

近期有Linux ASP.NET用户反映&#xff0c;在MVC网站的Web.config中添加 httpHandlers 配置用于处理自定义类型&#xff0c;但是在运行中并没有产生预期的效果&#xff0c;服务器返回了404&#xff08;找不到网页&#xff09;错误。经我亲自测试&#xff0c;在WebForm网站中&…

简单介绍Java中Comparable和Comparator

转载自 简单介绍Java中Comparable和ComparatorComparable 和 Comparator是Java核心API提供的两个接口&#xff0c;从它们的名字中&#xff0c;我们大致可以猜到它们用来做对象之间的比较的。但它们到底怎么用&#xff0c;它们之间有又哪些差别呢&#xff1f;下面有两个例子可以…

spring-kafka整合:KafkaTemplate-kafka模板类介绍

【README】 1&#xff0c;本文主要关注 KafkaTemplate的重点方法&#xff0c;并非全部方法&#xff1b; 2&#xff0c;KafkaTemplate 底层依赖于 DefaultKafkaProducerFactory &#xff0c; 关于 DefaultKafkaProducerFactory 的介绍&#xff0c;refer2 spring-kafka整合:…

安卓 on a null object reference_详解Object.prototype.__proto__

Object.prototype 的 __proto__ 属性是一个访问器属性(一个getter函数和一个setter函数), 暴露了通过它访问的对象的内部[[Prototype]] (一个对象或 null)。使用__proto__是有争议的&#xff0c;也不鼓励使用它。因为它从来没有被包括在EcmaScript语言规范中&#xff0c;但是现…

【SpringBoot】服务器JVM远程调试

目的 当系统部署到测试环境服务器时&#xff0c;难免会遇到bug。这个时候如果能远程调试&#xff0c;那么能够大大提高我们的生产效率&#xff0c;快速完成服务调试&#xff0c;最快发布生产环境。&#xff08;领导好评不就到手了&#xff09; 准备 Idea&#xff08;Java最好…

图说:为什么Java中的字符串被定义为不可变的

转载自 图说&#xff1a;为什么Java中的字符串被定义为不可变的字符串&#xff0c;想必大家最熟悉不过了&#xff0c;通常我们在代码中有几种方式可以创建字符串&#xff0c;比如&#xff1a;String s "Hollis";这时&#xff0c;其实会在堆内存中创建一个字符串对象…

值得推荐的微软技术公众号推荐

为开阔技术人眼界&#xff0c;促进技术人职业成长。小二在此诚意推荐最值得关注的微软技术公众号。平时关注推送的文章或多或少要么学到知识技能&#xff0c;要么收到一些启发&#xff0c;有利于个人成长。这些公众号为笔者个人积累&#xff0c;不一定都合大家口味&#xff0c;…

springboot:BeanPostProcessor示例及分析

【README】 1&#xff0c;本文主要分析 BeanPostProcessor 的作用&#xff0c; 开发方式&#xff1b; 2&#xff0c;BeanPostProcessor 是bean后置处理器&#xff0c; 简而言之就是bean被创建好了&#xff0c;之后如果需要对其属性进行修改&#xff0c;则 需要使用 BeanPost…

实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定

简介一般来说&#xff0c;我们创建类和接口的时候都是一个类一个文件&#xff0c;一个接口一个文件&#xff0c;但有时候为了方便或者某些特殊的原因&#xff0c;java并不介意在一个文件中写多个类和多个接口&#xff0c;这就有了我们今天要讲的内部类和内部接口。内部类先讲内…

Java 8 日期和时间解读

转载自 Java 8 日期和时间解读现在&#xff0c;一些应用程序仍然在使用java.util.Date和java.util.Calendar API和它们的类库&#xff0c;来使我们在生活中更加轻松的处理日期和时间&#xff0c;比如&#xff1a;JodaTime。然而&#xff0c;Java 8 引进的新的类库来处理日期和时…

云计算产值将超3000亿美元 亚马逊微软谷歌居三甲

腾讯科技讯 3月27日消息&#xff0c;据外电报道&#xff0c;云计算曾经主要是无法承担建造和维护基础设施的初创公司的解决方案&#xff0c;但对于管理数字业务的大型企业而言&#xff0c;云计算正快速成为省钱的管理数字业务的方式。市场调研公司IDC在上月的一份调查数据显示&…

oracle中join另一个表后会查询不出一些数据_面试必备 | 8个Hive数据仓工具面试题锦集!...

是新朋友吗&#xff1f;记得先点蓝字关注我哦&#xff5e;今日课程菜单Java全栈开发 | Web前端H5大数据开发 | 数据分析人工智能Python | 人工智能物联网进入数据时代&#xff0c;大数据技术成为互联网发展的核心要素之一。与此同时大数据开发工程师的薪资也成为行业内高薪的代…

springboot-Initializer例子及分析

【README】 1&#xff0c;本文主要编写了 初始化器例子并分析了其调用路径&#xff1b; 2&#xff0c;初始化器的执行顺序 先于 后置处理器&#xff1b; 后置处理器&#xff0c;refer2 springboot&#xff1a;BeanPostProcessor示例及分析_PacosonSWJTU的博客-CSDN博客【RE…

ASP.NET 开发人员不必担心 Node 的五大理由

哦别误会……我真的很喜欢 Node&#xff0c;而且我觉得它提出的概念和模式将在很长一段时间内&#xff0c;对服务端 Web 编程产生深远的影响。即使随着时间的推移 Node 过气了&#xff0c;我们肯定可以从下一个牛逼玩意身上或多或少的感觉到它的影响(不管好的和/或坏的)。而在这…

Spring Boot面试题

转载自 Spring Boot面试题 Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家。问题一 Spring Boot、Spring MVC 和 Spring 有什么区别&#xff1f; SpringFrameSpringFramework 最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就…

synchronized原理_Java并发编程 -- synchronized保证线程安全的原理

线程安全是并发编程中的重要关注点&#xff0c;应该注意到的是&#xff0c;造成线程安全问题的主要诱因有两点&#xff0c;一是存在共享数据(也称临界资源)&#xff0c;二是存在多条线程共同操作共享数据。因此为了解决这个问题&#xff0c;我们可能需要这样一个方案&#xff0…

转:Java 7 种阻塞队列详解

转自&#xff1a; Java 7 种阻塞队列详解 - 云社区 - 腾讯云队列&#xff08;Queue&#xff09;是一种经常使用的集合。Queue 实际上是实现了一个先进先出&#xff08;FIFO&#xff1a;First In First Out&#xff09;的有序表。和 List、Set ...https://cloud.tencent.com/de…

微软Build 2016前瞻:让开发者编写能畅行所有设备的app

本周三&#xff0c;5000名软件开发者将齐聚旧金山莫斯康展览中心参加微软公司年度开发者大会&#xff08;Build 2016&#xff09;&#xff0c;和往年一样&#xff0c;微软在大会上发布了一系列新的技术支持。 据透露&#xff0c;微软将会让开发人员编写可以在任何Windows设备上…

XSS的那些事儿

转载自 XSS的那些事儿XSS是什么XSS&#xff0c;Cross-site scripting&#xff0c;跨站脚本攻击&#xff0c;为了区分与CSS&#xff0c;起名为XSS。黑客利用网站的漏洞&#xff0c;通过代码注入的方式将一些包含了恶意攻击脚本程序注入到网页中&#xff0c;企图在用户加载网页时…

js 时间戳转换成时间_JavaScript 时间戳转成日期格式

我们在开发中经常需要把时间戳转化成日期格式&#xff0c;但 JavaScript 本身自带的 Date 方法并不像 PHP date 的那么强大。因此&#xff0c;我们就需要自己动手写一个方法。首先我们要先了解下需要用到的 JavaScript 自带的 Date 对象的方法&#xff1a;getDate&#xff1a;获…