深圳网站设计教程,南宁建站官网,高权重域名购买,没网站域名可以做备案吗前言
最近自己又在开始闲搞#xff0c;主要原因还是下山无望#xff08;买显卡#xff09;。只能晚上下班找点事情做啦~~
环境
版本请根据实际情况参考JJWT官网选择使用#xff0c;这里只说明一下问题大概思路#xff01;
!-- 增加token生成依赖 --
depen…前言
最近自己又在开始闲搞主要原因还是下山无望买显卡。只能晚上下班找点事情做啦~~
环境
版本请根据实际情况参考JJWT官网选择使用这里只说明一下问题大概思路
!-- 增加token生成依赖 --
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-api/artifactIdversion0.11.4/version
/dependency
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-impl/artifactIdscoperuntime/scopeversion0.11.4/version
/dependency
!-- 该依赖根据当前项目json解析器选择: 如果选择gson 则引入 jjwt-gson --
!-- 需要自定义序列化器, 需注释掉runtime域 --
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-jackson/artifactIdversion0.11.4/version
!--scoperuntime/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)┛