【Java】使用jjwt生成的token值,怎么解析明文不做过期校验处理??

在springboot中使用的是jjwt做的token,但是我想添加一个刷新token的机制,就是过期后,只要没有超过允许的范围内,可以再次生成一个新的token已达到刷新token的目的。

但是在生成新的token时,我需要在旧的token中解析出一些用户信息,用来生成新的token。但是在解析的时候总是抛出过期异常,有没有什么方法可以设置jjwt解析的时候,不做过期的校验

 public  static  String   getRefreshToken(String token) throws ParseException {

// 刷新token值

Claims body = Jwts.parser()

//设置签名的秘钥

.setSigningKey(TOKENKEY)

.parseClaimsJws(token)

.getBody(); // 从旧的token中解析出用户信息用于新token的生成

return "";

}

有没有什么方法可以让 Jwts.parser() 在解析时不要再做过期校验了。否则总是抛出异常,没法获取用户信息

回答

你可以在老的 jwt 失效的前一段时间,生成新的 jwt 就可以了。

后端返回新的响应头 new-jwt,前端检测有该响应头,用该新值来替换本地老的 jwt
之后再做请求就是新的 jwt

题主,你好,想要获取到payload,我觉得可以有以下两种方式,但是这两种方式的思考模式是不一样


jwt的定义出发

JWT官网的introduction中,我们不难发现,jwt是分3断的(headerpayload以及signature),而其中headerpayload最终结果都是经过Base64Url编码过的

这是header的说明
【Java】使用jjwt生成的token值,怎么解析明文不做过期校验处理??

这是payload的说明
【Java】使用jjwt生成的token值,怎么解析明文不做过期校验处理??

而我们所需要的信息那肯定在payload中,所以我们如果仅仅想要获取到实际的payload中的信息,我们是可以直接用Base64Url解码就可以了,从题主给的parseClaimsJws(token)方法入手我们也可以很快找到官方他们也是这样做的

DefaultJwtParser.parse292行
【Java】使用jjwt生成的token值,怎么解析明文不做过期校验处理??

从异常处理出发

第三方jarexception况下,一般来说我们自己的业务系统都是需要去做一些exception处理的,无论是转换为业务exception抛出,还是说仅仅只是记录exception,我们会针对别人提供的exception来做定制的处理,而往往exception不仅仅是指明了当前exception场景,有时候还需要携带出当前exception相关的参数的

还是从DefaultJwtParser.parse出发,第411行,看到了过期校验抛出的是ExpiredJwtException
【Java】使用jjwt生成的token值,怎么解析明文不做过期校验处理??

并且我们可以发现,抛出这个exception的构造参数是有claims的,查看API,发现有方法getClaims,恰好就是返回的claims
【Java】使用jjwt生成的token值,怎么解析明文不做过期校验处理??

所以这就很简单了,我们只需要catchExpiredJwtException,然后e.getClaims就可以获取到我们想要的参数了

以上仅供参考~

和我的实现方式几乎一样啊。贴一段代码自己试试吧,jwt就是生成的token。

    public Map parseJwtPayload(String jwt) {

String base64UrlEncodedHeader = null;

String base64UrlEncodedPayload = null;

String base64UrlEncodedDigest = null;

int delimiterCount = 0;

StringBuilder sb = new StringBuilder(128);

for (char c : jwt.toCharArray()) {

if (c == '.') {

CharSequence tokenSeq = io.jsonwebtoken.lang.Strings.clean(sb);

String token = tokenSeq != null ? tokenSeq.toString() : null;

if (delimiterCount == 0) {

base64UrlEncodedHeader = token;

} else if (delimiterCount == 1) {

base64UrlEncodedPayload = token;

}

delimiterCount++;

sb.setLength(0);

} else {

sb.append(c);

}

}

if (delimiterCount != 2) {

String msg = "JWT strings must contain exactly 2 period characters. Found: " + delimiterCount;

throw new MalformedJwtException(msg);

}

if (sb.length() > 0) {

base64UrlEncodedDigest = sb.toString();

}

if (base64UrlEncodedPayload == null) {

throw new MalformedJwtException("JWT string '" + jwt + "' is missing a body/payload.");

}

// =============== Header =================

Header header = null;

CompressionCodec compressionCodec = null;

if (base64UrlEncodedHeader != null) {

String origValue = TextCodec.BASE64URL.decodeToString(base64UrlEncodedHeader);

Map<String, Object> m = readValue(origValue);

if (base64UrlEncodedDigest != null) {

header = new DefaultJwsHeader(m);

} else {

header = new DefaultHeader(m);

}

compressionCodec = codecResolver.resolveCompressionCodec(header);

}

// =============== Body =================

String payload;

if (compressionCodec != null) {

byte[] decompressed = compressionCodec.decompress(TextCodec.BASE64URL.decode(base64UrlEncodedPayload));

payload = new String(decompressed, io.jsonwebtoken.lang.Strings.UTF_8);

} else {

payload = TextCodec.BASE64URL.decodeToString(base64UrlEncodedPayload);

}

JSONObject jsonObject = JSONObject.parseObject(payload);

Map<String, Object> map = jsonObject;

return map;

}

以上是 【Java】使用jjwt生成的token值,怎么解析明文不做过期校验处理?? 的全部内容, 来源链接: utcz.com/a/90866.html

回到顶部