1.什么是JWT?
JSON Web Token,通过数字签名的方式,以JSON为载体,在不同终端安全传输信息。
2.有什么用?
授权认证,用户一旦登录,后续每个请求都包含JWT,系统每次处理用户请求之前,都要进行JWT的安全校验,通过之后再进行处理。(可理解为发放的出入证件,可以用来保护后后台接口。)
3.JWT的组成
三个部分,由"."连接。
aaaaaa.bbbbbb.cccccc
第一部分(aaaaaa):Header,还要经过base64,才能构成第一部分。
{
'typ':'JWT', //token的类型
'alg':'HS256', //算法
}
第二部分(bbbbbb): Payload(载荷) 还要经过base64,才能构成第二部分。
Payload分为三个部分,分别是:标准中注册的声明、公共的声明、私有的声明。
{
"sub":'1234567890',
"name":'john',
"admin":true
}
第三部分(cccccc): Signature(签名)
将编码之后的header和payload加.拼接后,通过header中声明的加密方式加密,构成第三部分。
二、使用var encodedString = base64UrlEncode(header)+'.'+base64UrlEncode(payload);
var signature = HMACSHA256(encodingString,'secret');
1.pom.xml中导入依赖
io.jsonwebtoken jjwt0.9.1
2、JWT编码
package com.zy.utils;
import io.jsonwebtoken.*;
import org.junit.Test;
import javax.security.auth.Subject;
import java.util.Date;
import java.util.UUID;
public class JWT {
private long time =1000*60*24;
private String signature = "admin";
@Test
public void jwt(){
JwtBuilder jwtBuilder = Jwts.builder();//builder是用来构建jwt的对象
String jwToken = jwtBuilder
//Header的设置
.setHeaderParam("typ","Jwt")
.setHeaderParam("alg","HS256")
//PayLoad的设置
.claim("username","tom")
.claim("role","admin")
.setSubject("admin-test")
.setExpiration(new Date(System.currentTimeMillis()+time))//有效期oneday
.setId(UUID.randomUUID().toString())
//Signture的设置
.signWith(SignatureAlgorithm.HS256,signature)
.compact();
System.out.println(jwToken);
}
@Test
public void parser(){
//这里的token是运行jwt()之后产生的token。
String token = "eyJ0eXAiOiJKd3QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDI4MzcwNTIsImp0aSI6IjE0Zjk2ZDA0LWZiYjItNDMyMy1iMDYzLTI1MTViMzA1OWMzNCJ9.CpwjEGWe0iMJIf6V82r195fh3BZgthMmIlLzZb9Qf1U";
JwtParser jwtParser =Jwts.parser();
Jws claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);//通过这个签名signature对token进行解析。
Claims claims = claimsJws.getBody();
System.out.println(claims.get("username"));
System.out.println(claims.get("role"));
System.out.println(claims.getId());
System.out.println(claims.getSubject());
System.out.println(claims.getExpiration());
}
}
运行完jwt()的结果:
运行完parser()之后的结果:
在此感谢 楠哥教你学Java 分享的视屏,在此感谢带我走上学习道路上的各位老师,以后我也会学习他们身上的优良品质,为其他人百忧解难,让这份心情传递下去。



