JWT令牌快速入门
- 全称:
JSON Web Token
:是一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息基本可靠。 - 组成
- 第一部分:
Header
(头),记录令牌的类型、签名算法等。
例如:{"alg": "HS256", "typ": "JWT"}
- 第二部分:
Payload
(有效载荷),携带一些自定义信息,默认信息等。
例如:{"id":1,"name": "xiaoChenCoding"}
- 第三部分:
Signature
(签名),防止Token
被篡改,确保安全性。融入Header
、Payload
和指定密匙,通过指定签名算法计算而来。
- 第一部分:
- JWT官网
接下来我将帮助你快速入门JWT并实现一个员工登录接口并通过JWT令牌校验登录的合法性
入门教程
第一步
- 在
pom
文件引入JWT
依赖
<!--Java8及以下引入jjwt依赖即可-->
<!--JWT令牌-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!--如果是Java8以上版本还需要添加以下依赖:
因为 javax.xml.bind.DatatypeConverter 类已被弃用并从 Java SE 9 中移除。-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!--如果您使用的是 Java 11 或更高版本,则还需要添加 JAXB Runtime 依赖项-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
第二步
- 编写
JWT
生成类
@SpringBootTest
public class JWTTest {
/**
* 生成JWT令牌
*/
@Test
public void testGenJwt() {
// 定义载荷,即存放在JWT中的信息
HashMap<String, Object> claims = new HashMap<>();
claims.put("id",1);
claims.put("name","小陈Coding");
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "xiaoChenCoding")//添加签名算法和密匙
.setClaims(claims)//添加自定义内容(载荷)
.setExpiration(new Date(System.currentTimeMillis() + 60 * 1000 * 60 * 24))//设置有效期为1天
.compact();
System.out.println(jwt);
}
}
控制台输出:eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP6ZmIQ29kaW5nIiwiaWQiOjEsImV4cCI6MTcxMTczMzQ3M30.E-I6d5A_ClPOMV7HZZg4kiiyNGBvEH5-qCOEmocj9Gs
- 关于签名算法有很多种可以去官网查看
第三步
- 编写JWT解析类
@Test
public void testParseJwt() {
String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP6ZmIQ29kaW5nIiwiaWQiOjEsImV4cCI6MTcxMTczMzQ3M30.E-I6d5A_ClPOMV7HZZg4kiiyNGBvEH5-qCOEmocj9Gs";
Claims claims = Jwts.parser()
.setSigningKey("xiaoChenCoding")//设置解析的密匙
.parseClaimsJws(jwt)//需要解析的jwt令牌
.getBody();
System.out.println(claims);
}
控制台输出:{name=小陈Coding, id=1, exp=1711733473}
exp
是过期时间
实战教程
- 由于篇幅限制实战教程在另一篇博客 JWT实战教程