什么是JWT
简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。
由于数字签名的存在,这些信息是可靠的。
- jwt就是将原始的json数据格式进行了安全的封装,这样就可以直接基于jwt在通信双方安全的进行信息传输了。
- 简洁:是指jwt就是一个简单的字符串。可以在请求参数或者是请求头当中直接传递。
- 自包含:指的是jwt令牌,看似是一个随机的字符串,但是我们是可以根据自身的需求在jwt令牌中存储自定义的数据内容。如:可以直接在jwt令牌中存储用户的相关信息。
JWT组成
- Header(头)
- 记录令牌类型、签名算法等。 例如:{“alg”:“HS256”,“type”:“JWT”}
- Payload(有效载荷)
- 携带一些自定义信息、默认信息等。 例如:{“id”:“1”,“username”:“Tom”}
- Signature(签名)
- 防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来
记录令牌类型、签名算法等。 例如:{“alg”:“HS256”,“type”:“JWT”}
应用场景
登录
- 浏览器发起请求执行登录操作,如果成功,生成jwt令牌,并将其返回给前端
- 前端拿到jwt令牌后,将其存储,后续每次请求都会将JWT令牌携带到服务器
- 服务器统一拦截请求后,先判断JWT令牌是否存在且有效,如果是,放行。
项目中实现
- 导入依赖
pom.xml
- 生成JWT令牌的接口 与 对token进行解密的方法
JwtUtil.java
- 书写jwt令牌校验的拦截器
JwtTokenAdminInterceptor.jsva
- 将第二步骤 写的 jwt令牌校验的拦截器 放入配置类
WebMvcConfiguration
- 注册自定义拦截器
- 并指定要拦截的请求路径
- 以及需要排除哪些请求
- 在用户登录的时候需要利用
JwtUtil.java
为其生成令牌——在负责用户登录的controller中实现
注意:JWT令牌中存储着用户的id信息,如果后续需要的话,可以在校验令牌的时候,将id信息放入LocalThread
的封装方法BaseContext
,以便后续直接获得当前用户的id
- 适用于管理员插入某些信息,需要记录一下插入人(管理员)的id等情况
baseContext
是自己定义的类,里面新建了LocalThread
对象,里面只有几个方法:插入当前id,得到当前id
参考链接
用户登录
微信登录