接上篇博客,继续讲解JWT的使用。
本部分内容主要是SpringBoot项目中具体使用JWT的代码实现,包括了登录创建Token,后续请求验证Token,并且加入了JWT刷新机制等等。
本文大纲:
1.JWT的引入
2.JWT工具类的实现
3.登录申请Token
4.请求验证Token
5.JWT刷新机制的实现
注意:本文注重使大家理解JWT如何在SpringBoot项目中集成和使用,包含了我项目中JWT使用的90%的代码,剩下10%的代码比如代码中导包的信息,Dao持久层的代码等不包含在本文章中,因此还需要自己根据自己项目的情况去集成本文的代码。
==========================================开始分割线===============================================
1、JWT的引入
项目中引入Jar包依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
2、JWT工具类的实现
直接上工具类WebTokenUtil.java的源码,包含创建Token和校验,刷新机制等一系列操作:
public class WebTokenUtil {
private static final Logger logger = LoggerFactory.getLogger(WebTokenUtil.class);
//定义JWT的发布者,这里可以起项目的拥有者
private static final String TOKEN_ISSUSER = "issue";
//定义JWT的有效时长
private static final int TOKEN_VAILDITY_TIME = 30; // 有效时间(分钟)
//定义允许刷新JWT的有效时长(在这个时间范围内,用户的JWT过期了,不需要重新登录,后台会给一个新的JWT给前端,这个叫Token的刷新机制后面会着重介绍它的意义。)
private static final int ALLOW_EXPIRES_TIME = 60*24; // 允许过期时间(分钟)
/**
* 根据用户的登录时间生成动态私钥
* @param instant 用户的登录时间,也就是申请令牌的时间
* @return
*/
public static String genSecretKey(Instant instant){
return String.valueOf(instant.getEpochSecond());
}
public static String create(String secretKey, String subject, Instant issueAt) {
return create(secretKey, subject, issueAt, TOKEN_VAILDITY_TIME);
}
/**
* 生成token
* @param secretKey 根据用户的登录时间生成的秘钥
* @param subject JWT中payload部分自定义的内容
* @param issueAt 用户登录的时间,也就是申请令牌的时间
* @param validityTime 有效时长(分钟)
* @return
*/
public static String create(String secretKey, String subject, Instant issueAt, int validityTime) {
String token = "";
Algorithm algorithm = null;
try {
algorithm = Algorithm.HMAC256(secretKey);
} catch (IllegalArgumentException | UnsupportedEncodingException e) {
e.printStackTrace();
}
Instant exp = issueAt.plusSeconds(60*validityTime);
token = JWT.create()
.withIssuer(TOKEN_ISSUSER)
.withClaim("sub", subject)
.withClaim("iat", Date.from(issueAt))
.withClaim("exp", Date.from(exp))
.sign(algorithm);
logger.trace("create token ["+token+"]; ");
return token;
}
/**
* 字符串token 解析为 jwtToken
* @param token 要解析的Token
* @return
*/
public static DecodedJWT decode(String token){
DecodedJWT jwtToken = null;
try {
jwtToken = JWT.decode(token);
} catch (Exception e) {
e.printStackTrace();
}
return jwtToken;
}
/**
* 验证token
* @