一.什么是JWT?
JWT:全称JSON Web Token(JSON网络令牌)。通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。
二.JWT有什么作用?
JWT最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后再进行处理。
比喻:把系统比喻一家公司,我登录系统以后,就会给我发一个出入证,在进入公司的每个部门、每个房间之前,都要初始这个出入证,才能进入公司。这样使得公司安全性就比较高。
三.JWT的组成
JWT由3部分组成,之间用.拼接
如下图所示:

1.Header

我们将上面的JSON对象,通过Base64加密后,就成了1中的红线字符串。
2.Payload(载荷,存放有效信息的地方)

我们将上面的JSON对象,通过Base64加密后,就成了1中的黄线字符串。
3.Signature(签名,就是对前两部分再次加密)

先将前两部分的结果,用.拼接
然后将拼接结果再次加密,得到1中的绿线字符串
四.JWT的基本使用
1.引入依赖
jdk1.8只用加下面这一个依赖
XML
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
jdk1.8以后的依赖,还需加下面几个依赖
XML
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
2.编写测试方法
java
public class Test01 {
//设置有效时间为1天
private long time = 1000*60*60*24;
//设置签名信息
private String signature = "admin";
//创建JWT(Json Web Token)
@Test
public void jwt(){
//1.创建jwtBuilder,用于后续构建JWT(JSON WEB TOKEN)
JwtBuilder jwtBuilder = Jwts.builder();
//2.构建JWT
String jwtToken = jwtBuilder
//header
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
//payload
.claim("username","tom")
.claim("role","admin")
.setSubject("admin-test")
.setExpiration(new Date(System.currentTimeMillis()+time))
.setId(UUID.randomUUID().toString())
//signature
.signWith(SignatureAlgorithm.HS256, signature)
//将三者拼接成字符串即可
.compact();
//输出生成的JWT
System.out.println(jwtToken);
}
//解析jwt
@Test
public void parse(){
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE3NDc4NzYxNjUsImp0aSI6IjI0M2I3YmViLWZiNjAtNDJiZS1iYTgzLWRmNjJhMWQ2Y2FiZCJ9.-DLbbhSfedUp8_dIbAXvqGi_ItBSYnfO5jQgS_WDbhs";
JwtParser jwtParser = Jwts.parser();
//通过我们的自定义签名,对生成的token进行解析
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
//获取jwt中的信息
System.out.println(claims.get("username"));
System.out.println(claims.get("role"));
System.out.println(claims.getId());
System.out.println(claims.getSubject());
System.out.println(claims.getExpiration());
}
}
3.运行结果
上图jwt()测试方法运行结果如下:这就是由三部分组成的JWT令牌(出入证)。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE3NDc4NzY3MTgsImp0aSI6IjQ4MjY1ODVkLTMwYTMtNDBjYS1iYjNkLTExZWU3NTU1ZjkyNyJ9.4LhB5EPjEbR8pJ1j1t2bFFHbHWBk_SNatkr9oiWICtM
上图parse()测试方法运行结果如下:这就是解析上面的jwt后,得到的信息。
tom
admin
4826585d-30a3-40ca-bb3d-11ee7555f927
admin-test
Thu May 22 09:18:38 CST 2025
五.项目中JWT的使用
1.大致流程(两个功能)
①第一次登陆时,如果登陆成功,后端就返回token给前端保存起来

②前端后续的每次请求,都会携带token到后端进行认证,如果认证通过,才会允许前端进行后续操作
