jwt概述
JSON Web token简称JWT,是用于对应程序上的用户进行身份验证的标记,也就是说,使用JWT的应用程序不再需要保存与其有关的用户cookie或者session数据。此特性便于可伸缩性,同时保证应用程序的安全。
jwt内部结构
- jwt就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C
- A由jwt头部信息header加密得到
- B由jwt用到的身份验证信息json数据加密得到
- C由A和B加密得到,是校验部分
jwt鉴权流程
jwt入门案例
使用JWT工具,生成token,并将用户id和手机号码写入token中。
点击查看代码
@Test
public void createToken(){
//构建基础数据
Map<String, Object> userMap = new HashMap<>();
userMap.put("id",1);
userMap.put("phone","18312345678");
long now = System.currentTimeMillis();
//使用jwt工具类,生成token
String token = Jwts.builder().addClaims(userMap)//设置数据
//设置加密算法,添加密钥为:wzh666
.signWith(SignatureAlgorithm.HS256, "wzh666")
//设置过期时间
.setExpiration(new Date(now + 5000))
.compact();
System.out.println(token);
}
解析token
点击查看代码
@Test
public void parseToken(){
try {
String token="eyJhbGciOiJIUzI1NiJ9.1yJwaG9uZSI6IjE4MzEyMzQ1Njc4IiwiaWQiOjEsImV4cCI6MTY4NTg4ODI3N30.UK8NALoiCCXsAbMIyWTuoEKgJX9r5SWuWZNhXBbKNts";
Claims claims = Jwts.parser()
.setSigningKey("wzh666")
.parseClaimsJws(token)
.getBody();
Object id = claims.get("id");
Object phone = claims.get("phone");
System.out.println(id+"---"+phone);
}catch (ExpiredJwtException e){
System.err.println("token已过期");
}catch (SignatureException e){
System.out.println("token不合法");
}
}
token常见的两种异常
ExpiredJwtException:token过期
SignatureException:token不合法