JSON Web Token的简称
用户登录之后,在服务端生成jwt,然后服务端将jwt发送给用户端,然后客户端将jwt存到cookie里面,以后客户端每次向服务端通信都会携带jwt,服务端收到这个jwt就能解析用户的身份
jwt分成三部分:头部header 数据playload 签名signature,中间用.进行拼接,组成一个字符串
(1)header是一个json对象使用Base64URL转成的字符串:原始json 包含两个信息,第一个属性type指定token的类型,这里是JWT,最重要的是第二个属性alg,指定第三部分签名signature所使用的算法,默认是HSA256,然后将这个Json对象使用Base64URL转成字符串
(2)playload也是一个Json对象,用来存放实际需要传递的数据,这个Json对象也会使用Base64URL转成字符串
(3)signature:使用header里面的加密算法,对header,playload,服务端的密钥(可能是一个字符串,比如说“secret”)使用header中规定的HSA256算法进行加密,得到字符串signature
这里secret就是服务端的密匙
最后JWT由以上三部分组成,部分与部分之间用点作为分隔 :
总结jwt的生成流程:
jwt在项目中怎么使用:
step1加入jwt依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.1.0</version>
</dependency>
step2:加密和解密
String signature="admin";
public void jwt()
{
//算出一天有多少毫秒,注意是为了后面设置jwt有效时间做准备
long time=1000*60*60*24;
//创建一个Jwt对象
JwtBuilder jwtBuilder=Jwts.builder();
//设置一个JWT的三部分:Header,Payload,Signature
String jwtToken=jwtBuilder.setHeaderParam("Type","JWT")
.setHeaderParam("alg","HS256")
//上面是设置Header,下面设置payload载荷
.claim("username","tom")//添加payload载荷
.claim("role","tom")
.setSubject("admin-test")//设置子主题,这个可以自己加
.setExpiration(System.currentTimeMillis()+time)//设置有效时间,当前时间+24小时
.setId(UUID.randomUUID().toString())
//接下来设置Signature
.signWith(SignatureAlgorithm.HS256,signature)
.compact();//将三部分用点进行拼接
System.out.println(jwtToken);//可以打印出jwt:XXXXX.XXXXX.XXXXX
}
//对上面生成的jwt进行解密
public void Decoder()
{
String token="XXXXX.XXXXX.XXXXX";
JWTParser jwtParser=Jwts.parser();
jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims=claimsJws.getBody();
//接下来就可以拿到jwt里面Payload负载信息了
claims.get("username");
claims.get("role");
claims.getId();
claims.getSubject();
}