定义
JWT:通过数字签名的方式,以JSON对象为数据载体,在不同的服务终端之间安全的传输信息。
作用
授权认证,一旦用户登录,后续的每个请求都将包含jwt,系统在每次处理用户请求之前,都要先进行jwt安全校验。
组成
JWT主要由三部分组成,每部分用'.'隔开
这三部分主要是
Header(头部,其中typ是token类型,alg是使用的加密算法)
Payload(载荷,主要是存放有效信息)
Signature(签名)
使用
引入依赖:
<!--jwt依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
编写JWT
private long time=1000*60*60*24;//表示24h
private String signature="admin";//定义签名
@Test
public void jwt(){
//JwtBuilder用来构建jwt
JwtBuilder jwtBuilder= Jwts.builder();
String jwtToken=jwtBuilder
//header
.setHeaderParam("typ","JWT")
.setHeaderParam("alg","HS256")
//payload
.claim("username","admin")
.claim("role","user")
.setSubject("admin-test")
.setExpiration(new Date(System.currentTimeMillis()+time))//设置过期时间
.setId(UUID.randomUUID().toString())
//signature
.signWith(SignatureAlgorithm.HS256,signature)
.compact();//把三部分拼接起来
System.out.println(jwtToken);
}
得到输出的token值:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6InVzZXIiLCJzdWIiOiJhZG1pbi10ZXN0IiwiZXhwIjoxNjQ2NjM2MjY5LCJqdGkiOiJkMzVlZmJlNC1hZjM4LTQ1MjYtYTc5Yi01MTgzNjc5NzJiZmUifQ.2m-a7NnLVrdqlrce8Bfci28-THYQSxuJiGZpyuLh51M
解析JWT
@Test
public void parse(){
String token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6InVzZXIiLCJzdWIiOiJhZG1pbi10ZXN0IiwiZXhwIjoxNjQ2NjM2MjY5LCJqdGkiOiJkMzVlZmJlNC1hZjM4LTQ1MjYtYTc5Yi01MTgzNjc5NzJiZmUifQ.2m-a7NnLVrdqlrce8Bfci28-THYQSxuJiGZpyuLh51M";
JwtParser jwtParser=Jwts.parser();
//setSigningKey设置签名,parseClaimsJws解析token
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims=claimsJws.getBody();
System.out.println(claims.getId());//获取ID
System.out.println(claims.get("username"));//获取用户名
System.out.println(claims.get("role"));
System.out.println(claims.getSubject());
System.out.println(claims.getExpiration());//获取有效期
}
运行结果:
d35efbe4-af38-4526-a79b-518367972bfe
admin
user
admin-test
Mon Mar 07 14:57:49 CST 2022