【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断的(header
,payload
以及signature
),而其中header
和payload
最终结果都是经过Base64Url
编码过的
这是header
的说明
这是payload
的说明
而我们所需要的信息那肯定在payload
中,所以我们如果仅仅想要获取到实际的payload
中的信息,我们是可以直接用Base64Url
解码就可以了,从题主给的parseClaimsJws(token)
方法入手我们也可以很快找到官方他们也是这样做的
DefaultJwtParser.parse
292行
从异常处理出发
第三方jar
抛exception
况下,一般来说我们自己的业务系统都是需要去做一些exception
处理的,无论是转换为业务exception
抛出,还是说仅仅只是记录exception
,我们会针对别人提供的exception
来做定制的处理,而往往exception
不仅仅是指明了当前exception
场景,有时候还需要携带出当前exception
相关的参数的
还是从DefaultJwtParser.parse
出发,第411行,看到了过期校验抛出的是ExpiredJwtException
并且我们可以发现,抛出这个exception
的构造参数是有claims
的,查看API
,发现有方法getClaims
,恰好就是返回的claims
所以这就很简单了,我们只需要catch
住ExpiredJwtException
,然后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