JWT是对session的改进
传统的session
- 用户:向服务器发送用户名和密码
- 服务器:验证通过,在当前对话(session)会存放一个用户的相关数据,比如用户角色,登录时间等等
- 服务器:返回一个session_id,写到用户的cookie
- 用户:之后的每一次请求,都会把cookie里的session_id传给服务器
- 服务器得到session_id,也就知道了用户的身份
其实,说到底,可以把session_id看成是用户的身份id
JWT的改进
服务器索性不保存session数据,所有数据都保存在客户端
其实,个人认为最大的区别,是token会加密,而且保存在客户端上,等到需要再次查询的时候,服务器会获取到来自客户端的token,解密之后,查询到用户信息,并发送给用户。
JWT的格式
搭建SpringBoot + JWT工程
1.首先引入JWT依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
2.在工程 application.yml 配置文件中添加JWT的配置信息:
# token配置
token:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
expireTime: 30
3.创建JWT工具类:
/**
* 创建令牌
*
* @param loginUser 用户信息
* @return 令牌
*/
public String createToken(LoginUser loginUser)
{
String token = IdUtils.fastUUID(); //获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID
loginUser.setToken(token);
setUserAgent(loginUser);
refreshToken(loginUser);
Map<String, Object> claims = new HashMap<