所要的依赖包
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
秘钥用于signature(签名)部分的加密和解密
private static fianl String KEY = " nf-it ";
签发机构
private static fianl String ISS = "nf";
创建token令牌
/**
* claims 数据载体* ttl token的过期时间
**/
public static createToken(Map<String,Object>claims, long ttl){
JwtBuilder builder = Jwts.builder() //获取签名秘钥,并采用HS256的加密算法进行提签名 .signWith(SignatureAlgorithm.HS256, KEY) //jwt唯一标识 .setId(UUID.randomUUID().toString()) //设置数据内容 .setClaims(claims) //设置签发人 .setIssuer(ISS) //主题 .setSubject("JWT AUTH") //签发时间 .setIssuedAt(new Date()); //设置过期时间 if(ttl > 0) { builder.setExpiration(getExpDate(ttl)); } //创建jwt字符串并返回 return builder.compact(); }}
获取载体的数据
public static <T> T getPayload(String token, String name, Class<T> type) { return Jwts.parser() //解密 .setSigningKey(KEY) //解析token中的数据载体部分 .parseClaimsJws(token) //取出载体数据 .getBody() //根据name和type取中相应的value .get(name, type); }
Base64可以直接通过第二段的秘钥获取出数据
byte[] a = Base64.getDecoder().decode("eyJ1aWQiOjEwMDEsInN1YiI6IkpXVCBBVVRIIiwiaXNzIjoibmYiLCJleHAiOjE2NjY4NTU1NTYsImlhdCI6MTY2Njg1NTQzNn0"); String msg = new String(a); System.out.println(msg);
验证token的有效性,如果不通过就会抛出异常
public static void verify(String token) { Jwts.parser().setSigningKey(KEY).parseClaimsJws(token); }
根据用户传入的ttl计算出过期时间
private static Date getExpDate(long ttl) { //当前时间 + ttl = 过期时间 Date expDate = new Date(System.currentTimeMillis() + ttl); log.debug("Token过期时间:" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(expDate)); return expDate; }