介绍:jwt是一个开放的行业标准,它定义了一个简洁的,自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任;
官网:
标准:
优点:使用json作为数据传输,有广泛的通用型,并且体积小,便于传输;
不需要在服务器端保存相关信息;
jwt载荷部分可以存储业务相关的信息(非敏感的),例如用户信息,角色等;
组成:JWT令牌由Header,Payload,Signature三部分组成,每部分中间使用(.)分隔,比如:xxxx,yyyy,zzzz
第一部分:Header(头),作用:记录令牌类型,签名算法等;比如
{“alg":"HS56",
"type":"JWT"}
将上边的内容使用Base64编码,得到一个字符串就是JWT令牌的第一部分;
第二部分:Payload(有效载荷),作用:携带一些用户信息以及过期时间等;比如
{“id”:“1”‘
“username":"Tom"
}
最后将第二部分负载使用Base64编码,得到一个字符串就是JWT令牌的第二部分
第三部分:Signature(签名),作用:防止Token被篡改,确保安全性;比如:计算出来的签名,是一个字符串
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
base64UrlEncode(header): jwt令牌的第一部分
base64UrlEncode(payload):jwt的第二部分
secret:签名所使用的密钥;
生成:
1)pom.xml引入jwt的依赖
2)生成IWT代码实现
3)校验
注意事项:JWT校验时使用的签名密钥,必须和生成JWT令牌时使用的密钥是配套的
如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法
@Test
public void parseJwt(){
Claims claims = Jwts.parser()
.setSigningKey("itheima")
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjU5OTk1NTE3LCJ1c2VybmFtZSI6IlRvbSJ9.EUTfeqPkGslekdKBezcWCe7a7xbcIIwB1MXlIccTMwo")
.getBody();
System.out.println(claims);
}
JWT令牌的介绍,组成,生成,校验等基础知识,我们已经讲解完了;接下来,我们就要来完善之前开发的登录功能;那第一步呢,就需要在登录成功之后,生成JWT令牌并返回给浏览器
步骤:引入JWT工具类
登录完成之后,调用工具类生成JWT令牌并返回