一.在pom添加jwt依赖
<!-- JWT依赖 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</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>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
二.创建JwtTests测试类,演示JWT的基本使⽤
package com.ytx.springboot_jwt.test;
import io.jsonwebtoken.*;
import org.junit.Test;
import java.util.Date;
import java.util.UUID;
public class JwtTests {
private long time = 1000 * 60 * 60 * 1;
private String signature = "admin";
// 创建JWT
@Test
public void createJwt() {
JwtBuilder jwtBuilder = Jwts.builder();
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();
System.out.println(jwtToken);
}
// 校验JWT
@Test
public void checkJwt() {
String token =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1Y
iI6ImFkbWluLXRlc3QiLCJleHAiOjE2ODY5NTk1NjAsImp0aSI6ImZhMDMzMGVhLTc0YTMtNGI4My1hNmZiLTg1
MjA0ZGE2NDMyMCJ9.a0WKFt2rU-SVvWTrk_fqjDX_-Z6YLnxjVjD05oXajk4";
boolean result = Jwts.parser().isSigned(token);
System.out.println(result);
}
// 解析JWT
@Test
public void parseJwt() {
String token =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1Y
iI6ImFkbWluLXRlc3QiLCJleHAiOjE2ODY5NTk1NjAsImp0aSI6ImZhMDMzMGVhLTc0YTMtNGI4My1hNmZiLTg1
MjA0ZGE2NDMyMCJ9.a0WKFt2rU-SVvWTrk_fqjDX_-Z6YLnxjVjD05oXajk4";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
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());
}
}
2.2 SpringBoot+JWT
1.在com.ytx.springboot_jwt.domain包下创建User实体类。
package com.ytx.springboot_jwt.domain;
import lombok.Data;
@Data
public class User {
private String username;
private String password;
private String token;
}
2.在com.ytx.springboot_jwt.utils包下创建JWT⼯具类。
package com.example.demo.config;
import io.jsonwebtoken.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
import java.util.UUID;
public class JwtUtil {
private static final long time = 1000 * 60 * 60 * 1*10;
// private static final long time = 1000 * 10;//存活时间
private static final String signature = "admin";//签名
//生成token
public void createToken() {
//创建一个jwt对象
JwtBuilder jwtBuilder = Jwts.builder();
//jwtoken ->abc.def.xyz
String jwtToken = jwtBuilder
// Header
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256") //指定算法是HS256
// Payload 载荷
.claim("username", "tom")
.claim("role", "admin")
.setSubject("admin-test") //设置名称信息
.setExpiration(new Date(System.currentTimeMillis() + time))//设置过期时间
.setId(UUID.randomUUID().toString())//设置Id字段
// Signature 签名
.signWith(SignatureAlgorithm.HS256, signature)//设置加密算法和签名
// 使⽤"."符号连接
.compact();
System.out.println(jwtToken);
}
//判断token是否正确或者过时
public static boolean BooleanToken(String token) {
boolean signed = Jwts.parser().isSigned(token);
return signed;
}
//获取用户的数据
public static boolean checkToken(String token) {
//判断token是否为空
if (token == null || token == "") {
return false;
}
try {
//将Jwt转化为key-value,通过key获取值
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(signature).parseClaimsJws(token);
Claims body = claimsJws.getBody();//存储的是用户保存的数据 载荷 body
System.out.println(body.getId()); //获取ID
System.out.println(body.get("username")); //获取到Username
System.out.println(body.get("role"));//获取到role
System.out.println(body.getExpiration()); //获取到期时间
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
3.在com.ytx.springboot_jwt.controller包下创建UserController控制层类。
package com.ytx.springboot_jwt.controller;
import com.ytx.springboot_jwt.domain.User;
import com.ytx.springboot_jwt.utils.JwtUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("login")
public User login(User user) {
String username = "tom";
String password = "123456";
if (username.equals(user.getUsername()) && password.equals(password)) {
// 添加Token
user.setToken(JwtUtil.createToken());
return user;
}
return null;
}
/*
@GetMapping("check_token")
public boolean checkToken(HttpServletRequest request) {
String token = request.getHeader("token");
return JwtUtil.checkToken(token);
}
*/
@GetMapping("check_token")
public boolean checkToken(String token) {
return JwtUtil.checkToken(token);
}
}