当前位置:网站首页>JWT入门学习
JWT入门学习
2022-08-03 02:28:00 【joy妹妹是菜鸟】
因为http是无状态的协议,所以每次请求都需要进行用户认证(账户名称和密码),否则http无法识别出是否登录过,所以我们将用户信息存入session,将session保存在Redis中,服务器每次收到请求,先去Redis缓存中查询该用户是否登陆过。虽然相比在数据库中查询信息快了很多,但是还是十分浪费时间和空间。于是我们引入JWT,JWT是存用户信息的字符串,存在于网络上。
JWT
用户登录鉴权
将用户信息存放进token中,token是按照一定规则生成的字符串。官方的规则是JWT
JWT的数据结构
JWT一般是这样一个字符串,分为三个部分,以"."隔开:xxxxx.yyyyy.zzzzz
Header:jwt头信息.它是一个描述JWT元数据的Json对象
{ "alg": "HS256", "typ": "JWT" }
Payload:有效载荷 包含主体信息(用户信息),也是一个Json对象,除了包含需要传递的数据,还有七个默认的字段供选择。
{ //默认字段 "sub":"主题123", //自定义字段 "name":"java技术爱好者", "isAdmin":"true", "loginTime":"2021-12-05 12:00:03" }
Signature:签名哈希 防伪标志。需要指定一个secret,该secret仅仅保存在服务器中
(盐值加密:得到原数据后,将原数据和加密数据一起加密)
JWT流程
- 用户使用账号、密码登录应用,登录的请求发送到Authentication Server。
- Authentication Server进行用户验证,然后创建JWT字符串返回给客户端。
- 客户端请求接口时,在请求头带上JWT。
- Application Server验证JWT合法性,如果合法则继续调用应用接口返回结果。
可以看出与token方式有一些不同的地方,就是不需要依赖redis,用户信息存储在客户端。所以关键在于生成JWT,和解析JWT这两个地方。
怎么使用JWT
引入Maven依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.19.2</version>
</dependency>
Controller层代码
@RestController
@RequestMapping("/jwt")
public class JWTTestController {
@RequestMapping("/test.do")
public Map<String,Object> test(){
HashMap<String,Object> result = new HashMap<>();
List<String> permission = new ArrayList<>();
permission.add("/user/login.do");
permission.add("/logic/logic.do");
String token = JWT.create().withClaim("username","liguocheng")
.withClaim("perms",permission)
.sign(Algorithm.HMAC256("xiaopang"));
result.put("token",token);
return result;
}
@RequestMapping("/resolve.do")
public Map<String,Object> resolve(String token){
JWTVerifier verifier = JWT.require(Algorithm.HMAC256("xiaopang")).build();
DecodedJWT decode = verifier.verify(token);
HashMap<String,Object> map = new HashMap<>();
map.put("perms",decode.getClaim("perms").asList(String.class));
map.put("username",decode.getClaim("username").asString());
return map;
}
}
前端生成token的代码:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
</body>
<script> $.ajax({
url:"/jwt/test.do", type:"post", success:function (res) {
var token = res.token; document.cookie = "token="+token;//js获取当前浏览器保存cookie的方法 } }) </script>
</html>
另一个页面解析token:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
</head>
<body>
</body>
<script> $.ajax({
url:"/jwt/resolve.do", // data:{"token":document.cookie.split("=")[1]}, data:{
"token":$.cookie("token")}, success:function (res) {
console.log(res); } }) </script>
</html>
边栏推荐
猜你喜欢
随机推荐
QCheckBox、margin、border、pandding、QHoxLayout、QSplitter、QSpacerItem
5. Software testing ----- automated testing
C语言实验十一 指针(一)
LVS-NAT模式【案例实验】
机器学习【KNN案例、API、总结】
46LVS+Keepalived群集
【Flink】使用arthas在线诊断flink的那些事
leetcode:153. 寻找旋转排序数组中的最小值
mysql-installer安装教程(详细图文)
流程图(1)
通过kubernetes可视化界面(rancher)安装kibana
五大靠谱的婚恋相亲APP详细特点缺点分析!
关于 Redis 必问面试题,你知道哪些?
kubernetes部署ldap
【UE4】搭建局域网内VR直播 UE4.27
vsftp容器搭建+go开发web用户管理界面(更新于2022.02.23)
Topic Modeling of Short Texts: A Pseudo-Document View
C语言入门--指针
FLIR E95 在8层楼看马路上行驶的CAR的热成像形态?
zyMedia系列之播放视频