话不多说 直接上代码
封装类
package cn.k23.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @Description: 令牌封装
* @Author: k23
* @Date: 2022-04-08 10:57
* @Version: 1.0
*/
public class JwtUtils {
private String sign = "k23";
public JwtUtils(String sign){
this.sign=sign;
}
public JwtUtils(){
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
//生成令牌
public String getToken(Map<String,String> payload, int minutes){
Calendar c = Calendar.getInstance();
c.add(Calendar.MINUTE,minutes);
JWTCreator.Builder builder = JWT.create();
if(payload!=null)payload.forEach(builder::withClaim);
String token = builder.withExpiresAt(c.getTime()).sign(Algorithm.HMAC256(sign));
return token;
}
//校验令牌
public boolean verifyToken(String token){
boolean flag = false;
JWTVerifier jv = JWT.require(Algorithm.HMAC256(sign)).build();
try {
DecodedJWT dv = jv.verify(token);
flag=true;
} catch (TokenExpiredException tee){
System.out.println("令牌已过期!");
}catch (SignatureVerificationException sve) {
System.out.println("令牌异常,签名被非法篡改!");
} catch (Exception e) {
System.out.println("令牌异常!");
}
return flag;
}
//读取令牌负载信息
public Map<String,String> getPayLoad(String token){
Map<String,String> map = new HashMap<>();
if (verifyToken(token)){
JWTVerifier jv = JWT.require(Algorithm.HMAC256(sign)).build();
try {
DecodedJWT dv = jv.verify(token);
Map<String, Claim> mc = dv.getClaims();
for (String k:mc.keySet()){
map.put(k,k.equalsIgnoreCase("exp")?String.format("%tF %<tT",mc.get(k).asDate()):mc.get(k).asString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
return map;
}
}
使用
package cn.k23.utils;
/**
* @Description:
* @Author: k23
* @Date: 2022-04-08 11:54
* @Version: 1.0
*/
public class JwtOk {
public static void main(String[] args) {
//生成5分钟有限期令牌
System.out.println(new JwtUtils("k23").getToken(null,5));
//校验令牌
String t = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkzOTEwOTh9.WF8MvKfjQUg70ngAihgVnpr7Vq32gQ16PUChpZ61BCs";
System.out.println(new JwtUtils("k23").verifyToken(t));
System.out.println(new JwtUtils("k23").getPayLoad(t));
}
}