JWT是一种规范,本身也是一个字符串,作用就是加密,不便于理解,
程序可以解读其信息,往往作为令牌使用,;
JWT 是 JSON Web Token 的缩写, 翻译是 JSON 网络 令牌 的意思;
JWT 字符串 由 3个 部分组成
头部:
是一个json字符串 描叙一下 基本信息:例如说明 类型 算法 等
比如说这个 json 字符串
{"typ":"JWT","alg":"HS256"}
在头部指明了签名算法是HS256算法。 我们进行BASE64编码http://base64.xpcha.com/,编码后的字符串如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
就是
{"typ":"JWT","alg":"HS256"} 变变变 eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
载荷:
载荷就是 JWT 放 信息的地方,好像是 货车 的 车厢
格式同 头部
例如
{"sub":"1234567890","name":"John Doe","admin":true}
=>
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
签证:
文章煞尾 的作用 + 字符串 加盐加密 的作用
最后这里 是一个 存储的字符串,类似这样
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
签证这里 最重要的是 一个 字符串, 再解析整个JWT字符串的时候需要用到,你不知道 签证字符串 是什么 ,就无法 解析整个 JWT 字符串
整个
JWT字符串 类似是这个样子 包含了如上3部分信息
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
/******************************************************************************************************************************************/
JWT作为
令牌使用的时候 往往 通过是 后台 添加头 信息 发给客户端,也可以做成cookie 发给客户端;
/*****************************************************************************************************************************************/
Apache开源的JJWT
操作 JWT
1.0生成 JWT
2.0解析JWT
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
首先需要如下依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
然后
可用这个类生成 JWT
JwtBuilder builder= Jwts.builder()
.setId("888") //设置唯一编号
.setSubject("某JSON")//设置主题 可以是JSON数据
.setIssuedAt(new Date())//设置签发日期
.signWith(SignatureAlgorithm.HS256,"biyou");//设置签名 使用HS256算法,并设置SecretKey(字符串),这个"biyou"是关键,后面解析要用这个
//构建 并返回一个JWT字符串
System.out.println( builder.compact() );
>>>>>>>>>>>>>>>>>
然后你要拿 这个 JWT 字符串做什么都行
解析JWT字符串,可以理解是(货车卸货)
String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDQxODF9.ThecMfgYjtoys3JX7dpx3hu6pUm0piZ0tXXreFU_u3Y";
Claims claims = Jwts.parser().setSigningKey("biyou").parseClaimsJws(compactJwt).getBody();
//卸货
System.out.println(claims);
/*************************************************************************************/
以上是JJWT 的基本操作, JJWT 也可以给 生成的 JWT 字符串 设置 过期时间,
如果是已过期的 JWT 字符串,JJWT 在解析的时候,会抱一个ExpiredJwtException的异常,用try-catch !!专门!!抓一下这个异常
就知道 这个 这个 JWT 过期了,
JJWT设置过期时间如下
long currentTimeMillis = System.currentTimeMillis();
Date date = new Date(currentTimeMillis+10086L);
JwtBuilder builder= Jwts.builder()
.setId("888") //设置唯一编号
.setSubject("某JSON")//设置主题 可以是JSON数据
.setIssuedAt(new Date())//设置签发日期
.setExpiration(date)//设置过期时间
.signWith(SignatureAlgorithm.HS256,"biyou");//设置签名 使用HS256算法,并设置SecretKey(字符串)
//构建 并返回一个字符串
System.out.println( builder.compact() );
JJWT解析
String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDUzMDgsImV4cCI6MTU1NzkwNTMwOH0.4q5AaTyBRf8SB9B3Tl-I53PrILGyicJC3fgR3gWbvUI";
Claims claims = Jwts.parser().setSigningKey("biyou").parseClaimsJws(compactJwt).getBody();
System.out.println(claims);
>>>>>>>>>>>>>>>>>>>>
如果设置了过期时间 解析 需要 try-catch 一下 专门 抓 过期异常 ExpiredJwtException ;