JWT
1.是什么?Json Web Token的简称
2.JWT的结构是?Header + Payload + Sign
3.如何搞
1.pom.xml加依赖
<!-- JWT相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${io.jsonwebtoken.jjwt.version}</version>
</dependency>
2.构建Token
private static final long EXPIRE = 1000 * 60 * 60 * 24 * 7;
String token = Jwts.builder()
//第一部分Header
.setHeaderParam("typ","JWT") //header中的类型
.setHeaderParam("alg","HS256") //header中加密算法
//第二部分Payload
.setSubject("主题名") //主题
.claim("key1", "value1") //需要携带的kv1
.claim("key2", "value2") //需要携带的kv2
.setIssuedAt(new Date()) //签发时间
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) //到期时间
//第三部分Sign
.signWith(SignatureAlgorithm.HS256, "自定义的秘钥")
//拼接
.compact();
3.解密Token
public static Claims checkJWT(String token) {
Claims claims = Jwts.parser().setSigningKey("自定义的秘钥")
.parseClaimsJws(token).getBody();
return claims;
}
通过claims.get("key1")/.getXXX获取kv值。
4.流程
1.登录,用手机号查库,获得密码
2.匹配密码,正确后,生成token令牌,把用户需要全局共享的信息,放入claim(k,v)里
3.得到一个String后,返回给用户。
4.用户将这个String放入header中,对api进行请求
5.拦截器Interceptor前置方法,获取header中的token,执行解密方法checkJWT,获得Claims。
6.claims为空就是过期或者token作假,有数据就get方法,将共享值拆解,给保存在全局方法里等待使用。
注:同事使用的是,来共享全局变量
public static ThreadLocal<LoginUser> threadLocal = new ThreadLocal<>();