当前位置: 首页 > news >正文

JWT详解、JWTUtil工具类的构建方法

一、前言

使用一些用户不友好的项目时,会发现,每一次进入网站,我们都要重新登录
这是为什么呢?
现代多采用前后端分离的项目架构,这种架构,前后端使用不同的服务器,两个服务器上存储的信息不一致。
用户一般直接访问的,是前端服务器。
在后端,为了避免恶意攻击,开发者必须考虑身份验证的问题。
简单点说,你必须只让允许的人进来
解决方案很多,过去常用的是cookie,后来为了安全,又延伸出一个session。
再后来,由于分布式开发的需求和性能的需求,必须有一个统一管理的验证机制,这就是出现了token验证
不过,token信息存储在数据库中,且无结构化信息,使用起来相对麻烦。
我们需要一个机制,不存储在数据库中,并且能够方便访问。
这就是衍生出的JWT,这也是今天话题的主角。

二、JWT的基础信息

  1. JWT令牌的本质,就是一段加密过的字符串
  2. JWT令牌全称叫Json Web Token。
  3. JWT由3个部分组成:头部header、负载payload、签名signature。
  4. JWT的头部存储配置信息。
  5. JWT的负载存储真正传输的数据
  6. JWT的签名,是认证的核心,保证其不被修改。

三、JWT的头部header

header存储配置信息,一般有2个:

  • typ : jwt;类型,表示令牌种类,一般是jwt
  • alg:HS256,加密算法,种类比较多。

四、JWT的负载payload

这是存储数据的区域,具体内容由开发者自定义,一般会写:

  • subject主题:表示这个jwt令牌干什么用的,可以自定义。
  • exp:过期时间,这个最重要,一般的jwt令牌都会有。
  • 其它:比如用户的id,使得JWT一定唯一。

五、JWT的签名signature

签名是最重要的验证机制,它由头部、负载和密钥三部分信息,经过算法加密而成,具体内容不确定,调用算法即可。
密钥:密钥可以自定义或随机生成,但是要符合一定规则。【密钥一般是一段字符串,如果使用工具生成,也可以是一个SecretKey包装类】
比如:使用HS256算法加密,密钥就必须在256bits以上。【其它的,视具体算法确定,一般都是长度规则】
密钥必须妥善保管,这是保证jwt令牌唯一的重要数据。

六、JWT是如何保证唯一的

在负载payload中,一般会有几个属性,能够唯一标识用户。
比如用户id、用户name、用户手机号。
如果这个用户jwt丢失,重新访问后端服务器,由于过期时间一般固定,也能保证jwt唯一,就算不唯一,只要满足规则,其访问也不会出错。

七、JWTUtil工具类如何构建

经过上面的学习,我们大概知道jwt是什么了,那么,就该了解它的使用方法了。

第一,流程

jwt是我们后端服务器生成的一段字符串,所以要有创建这一步骤。
当前端把jwt令牌传来时,我们要把它解析成可以理解的格式,所以也要有解析这一步骤。
过滤器的构建,是Spring MVC的内容,在此不介绍。
忽略过滤器的构建,我们只需要做两件事:创建jwt和解析jwt

第二,创建jwt【负载根据需求自己设置】

由于jwt有3个部分,所以要分别构建头部、负载和签名。
代码基本固定,为:

public static String createJWT(String id){// 设定jwt的头部、负载,并进行签名和打包链接// jwt比较复杂,所以用builder构建JwtBuilder builder = Jwts.builder();// 设定头部的方法setHeadParamString res = builder.setHeaderParam("alg", "HS256").setHeaderParam("typ", "jwt")// 设定负载的方法,claim.claim("username","tom").claim("id", id).claim("permission", 0)// 常用的一些负载,允许用内置方法设置.setSubject("test_admin").setExpiration(new Date(System.currentTimeMillis()+ttlMillis))// 签名方法,指定加密算法HS256,和密钥SECRET_KEY.signWith(SignatureAlgorithm.HS256, SECRET_KEY)// compact是将三个部分连接起来,并返回一个字符串。【3部分通过.号连接】.compact();// 转化为字符串return res;
}

第三,解析JWT令牌

由于签名用于确保信息有效,头部是配置信息,所以对于业务逻辑,最关键的是负载payload。
在jwt机制中,payload采用Claims类存储。
Claims类:一个数据类,本质就是一个Map结构。
通过key,得到value。
由于JWTUtil类只创建、解析jwt,而不进行其它的业务逻辑,所以应该把Claims传递给其它方法处理。
当然,为了方便,我们可以将Claims的数据拿出来,存储在一个Map中,再交给其它方法处理。
固定的代码为

public static Claims parseJWT(String jwt){// 创建JWTPaser实例JwtParser jwtParser = Jwts.parser();// 按照密钥、jwt令牌解密Jws<Claims> claimsJws = jwtParser.setSigningKey(SECRET_KEY).parseClaimsJws(jwt);// claims类有一个Map,存储一对一的数据Claims claims = claimsJws.getBody();// 返回给上级处理return claims;
}

八、结语

我是蚊子码农,如有补充,欢迎在评论区留言。个人的知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

相关文章:

  • 贪心算法学习四
  • 推荐常用的三款源代码防泄密软件
  • Cocos2d-x 4.0 工程首次建立与编译(Mac m1)
  • 利用C#和Snap7工具模拟S7通信(包含DB地址讲解)
  • B端业务需求分析的3大注意事项
  • 栈帧浅析,堆栈漏洞概述——【太原理工大学软件安全期末补充】
  • HarmonyOS开发日记 :自定义节点,实现 UI 组件 动态创建、更新
  • 279 基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计
  • 一文读懂OpenGVLab带来的最新视觉预训练框架
  • 【idea】解决springboot项目中遇到的问题
  • 智能网站管理系统
  • C语言运算中的临时匿名变量
  • JY-156/1静态电压继电器 板前接线 约瑟JOSEF
  • 人工智能中实现自动化决策与精细优化的核心驱动力
  • MySQL:概念、逻辑与物理结构设计详解
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Angular数据绑定机制
  • java多线程
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • learning koa2.x
  • leetcode讲解--894. All Possible Full Binary Trees
  • MobX
  • python 学习笔记 - Queue Pipes,进程间通讯
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue 个人积累(使用工具,组件)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 安卓应用性能调试和优化经验分享
  • 编写高质量JavaScript代码之并发
  • 从0实现一个tiny react(三)生命周期
  • 前端
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何优雅地使用 Sublime Text
  • 三栏布局总结
  • 微信小程序填坑清单
  • 延迟脚本的方式
  • 正则学习笔记
  • ‌移动管家手机智能控制汽车系统
  • #{} 和 ${}区别
  • #define 用法
  • #Linux(帮助手册)
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (Ruby)Ubuntu12.04安装Rails环境
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (转)ABI是什么
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)原始图像数据和PDF中的图像数据
  • (转载)从 Java 代码到 Java 堆
  • . NET自动找可写目录
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET NPOI导出Excel详解
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)