【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.parse292行
从异常处理出发
第三方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
