一.什么是JWT?
JWT 是一个开放标准,它定义了⼀种⽤于简洁,自包含的用于通信双方之间以 JSON 对象的
形式安全传递信息的方法。 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名,简单来
说: 就是通过⼀定规范来⽣成token,然后可以通过解密算法逆向解密token,这样就可以获取
用户信息
二.首先需要在pom.xml文件中添加相应的依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
三.在Utils包中建立JWTSUtils类实现生成token
/**
* JWT工具类
* 注意点:
* 1.生成的token是可以通过base64进行解密出明文信息
* 2.base64进行解密出的明文信息,修改再进行编码,则会解密失败
* 3.无法作废已经颁布的令牌token,除非改密钥
*/
public class JWTUtils {
/**
* 过期时间为一周
*/
private static final long Expire=60000*60*24*7;
/**
* 密钥
*/
private static final String secret="xdclass.net168";
/**
* 令牌前缀
*/
private static final String Token_PreFix="xdclass";
/**
* subject主题
*/
private static final String SUBJECT="xdclass";
/**
* 根据用户信息生成令牌
* @param user
* @return
*/
public static String geneJsonWebToken(User user){
String token = Jwts.builder().setSubject(SUBJECT)
.claim("head_img", user.getHeadImg())
.claim("id", user.getId())
.claim("name", user.getName())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + Expire))
.signWith(SignatureAlgorithm.HS256, secret).compact();
token=Token_PreFix+token;
return token;
}
注解:
JWT格式组成 头部、负载、签名
header+payload+signature
头部:主要是描述签名算法
负载:主要描述是加密对象的信息,如⽤户的id等,也可以加些规范⾥⾯的东⻄,如iss
签发者,exp 过期时间,sub ⾯向的⽤户
签名:主要是把前⾯两部分进⾏加密,防⽌别⼈拿到token进⾏base解密后篡改token
代码解释:.claim("head_img", user.getHeadImg()) .claim("id", user.getId()).claim("name", user.getName())链式调用在负载里注入图片信息,id,用户名。
setIssuedAt(new Date())设置开始时间
setExpiration(new Date(System.currentTimeMillis() + Expire))设置过期时间
signWith(SignatureAlgorithm.HS256, secret)用私钥对签名算法进行加密
四.通过Jwts逆向解密token
public static Claims checkJWT(String token){
try{
final Claims claims = Jwts.parser().setSigningKey(secret)
.parseClaimsJws(token.replace(Token_PreFix, ""))
.getBody();
return claims;
}catch (Exception e){
return null;
}
}
setSigningKey(secret)通过私钥对token进行解密
五.关于JWT客户端存储
可以存储在cookie,localstorage和sessionStorage⾥⾯