1.JSON Web Token (JWT)是一种自包含令牌。自包含令牌本身已经包含了用户的相关信息,然后将这些信息通过例如加密的形式形成的令牌,由服务器进行解密从而完成对用户信息的确认。JWT一共由头、载荷与认证签名三个部分组成。然后由这三段字符拼接形成,每个部分通过"."分隔。如下图所示:
2.JWT的配置
需要引入相应的依赖:
<!--jwt工具-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
3.创建一个jwt令牌
public void CreateJwtToken(){
JwtBuilder jwtBuilder= Jwts.builder();
//密钥
String signKey="pjl-rongzibao";
//设置头、载荷与签名
String jwtToken=jwtBuilder
//设置头
.setHeaderParam("alg","HS256")
.setHeaderParam("typ","JWT")
//设置载荷:自定义的信息
.claim("nickname","MyName")
.claim("pwd","123456")
.claim("role","admin")
//设置载荷:默认信息
.setSubject("rzb-user")//令牌主题
.setIssuer("pjl") //签发者
.setAudience("the_server")//接收方
.setIssuedAt(new Date())//令牌签发时间
.setExpiration(new Date(System.currentTimeMillis()+100*60*60*2))//过期时间
.setNotBefore(new Date(System.currentTimeMillis()+1000))//生效时间
.setId(UUID.randomUUID().toString())//唯一身份标识
//设置签名哈希
.signWith(SignatureAlgorithm.HS256,signKey)
//组装jwt字符
.compact();
System.out.println(jwtToken);
}
由上可知,载荷是jwt令牌的主体部分,拥有如下图的属性:
运行代码后,可得到下图的jwt令牌:
4.通过jwt令牌获取用户信息
第3部分中,我们最终生成了一串jwt令牌,下面服务器需要通过令牌解析出用户的信息:
public void getUserInfo(){
String jwtToken="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuaWNrbmFtZSI6Ik15TmFtZSIsInB3ZCI6IjEyMzQ1NiIsInJvbGUiOiJhZG1pbiIsInN1YiI6InJ6Yi11c2VyIiwiaXNzIjoicGpsIiwiYXVkIjoidGhlX3NlcnZlciIsImlhdCI6MTcwOTI4MzYwOCwiZXhwIjoxNzA5Mjg0MzI4LCJuYmYiOjE3MDkyODM2MDksImp0aSI6IjRlOTAwNWQ0LWI1YWUtNDdkNy05N2ZhLWYyZmMyYWU3ZGJhNCJ9.8vsvEp-gGe7LmAq7DuXNon7641Zq3enkINW8YINEjsU";
//密钥:需要和生成jwt时候的密钥相同
String signKey="pjl-rongzibao";
JwtParser jwtParser=Jwts.parser();
Jws<Claims> claimsJws= jwtParser.setSigningKey(signKey).parseClaimsJws(jwtToken);
Claims claims=claimsJws.getBody();
System.out.println((String)claims.get("nickname"));
System.out.println((String)claims.get("pwd"));
System.out.println((String)claims.get("role"));
}
运行后可以看到解析的内容与第3部分设定的内容完全一致: