1.JWT概述
1.1 什么是JWT
JSON Web Token
,简称JWT
。通过数字签名
的方式,以JSON对象为载体,在不同的服务终端之间传输信息。
(个人理解:JWT帮我们生成了很长的一个信息,然后将这个信息放在JSON字符串中,再以JSON字符串为载体,在不同的服务器之间进行流转)
1.2 JWT有什么用
JWT通常用于Web应用程序中的身份验证和授权目的。一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全检验,通过之后在进行处理(这个东西就是一个令牌)
1.3 JWT的组成
JWT由Header
、Playload
、Signature
三部分组成,由.
拼接,令牌最终的格式大致为这样:abc.def.xyz
。(这个jwtToken令牌共有这三部分)
2.JWT的基本使用
2.1 首先创建一个项目
使用IDEA创建一个springboot项目
暂时先勾一个springboot-web就行,
2.2 加入jwt的依赖
我就直接把我的依赖粘上去了,除了一些必要的依赖外,要注意自己的jdk版本,如果你的jdk版本在1.8之上,就要加入其他的一些依赖,因为我的jdk版本就在1.8之上,因此其他的一些依赖,已经在下方了,请认真观察
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot_jwt</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_jwt</name>
<description>springboot_jwt</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--JWT依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>compile</scope>
</dependency>
<!--JWT相关依赖,jdk1.8以上版本还需引入以下依赖-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.3 JWT的创建
创建一个jwtToken,我们可以知道,一个令牌共有三部分:
Header
、Playload
、Signature
我们先写一个测试类,以用于进行测试生成jwtToken
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.Test;
import java.util.Date;
import java.util.UUID;
public class JwtTests {
//定义时间,用于生成的jwtToken的过期时间
private long time = 1000 * 60 * 60 *1;
//定义一个签名
private String sign = "admin";
@Test
public void createJwt(){
//创建一个JwtBuilder对象
JwtBuilder jwtBuilder = Jwts.builder();
//jwtToken -> abc.def.xyz
String jwtToken = jwtBuilder
//Header:头部
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg","HS256")
//Payload:载荷
.claim("username","tom")
.claim("role","admin")
.setSubject("admin-test")
//Token的过期时间
//System.currentTimeMillis() 用来获取当前时间
.setExpiration( new Date(System.currentTimeMillis() + time))
//id字段
.setId(UUID.randomUUID().toString())
//设置 Signature: 签名
//设置加密算法和签名
.signWith(SignatureAlgorithm.HS256, sign)
//使用"."连接成一个完整的字符串
.compact();
System.out.println(jwtToken);
}
}
里面的每一行代码,我都做了比较详细的解释,希望认真看看
将这个类运行一下,点击如图所示
我运行的结果如下:
此时,我们的jwt就已经创建完成