|
|
package com.yanzhen.framework.jwt; // 定义包名
|
|
|
|
|
|
import com.yanzhen.entity.Student; // 导入Student类
|
|
|
import com.yanzhen.entity.User; // 导入User类
|
|
|
import com.yanzhen.framework.exception.MyException; // 导入自定义异常类MyException
|
|
|
import io.jsonwebtoken.*; // 导入JWT相关类
|
|
|
import org.springframework.util.StringUtils; // 导入Spring框架的StringUtils工具类
|
|
|
|
|
|
import java.util.Date; // 导入Date类
|
|
|
import java.util.HashMap; // 导入HashMap类
|
|
|
import java.util.Map; // 导入Map接口
|
|
|
import java.util.UUID; // 导入UUID类
|
|
|
|
|
|
|
|
|
public class JWTUtil {//jwt的工具类
|
|
|
|
|
|
public static String token = "token"; // 定义静态变量token,用于存储token字符串
|
|
|
//秘钥
|
|
|
public static String jwt_secret="yanzhen@cms@cc596183363."; // 定义静态变量jwt_secret,用于存储JWT签名的密钥
|
|
|
//过期时长
|
|
|
public static long jwt_expr = 3600*24*1000; // 定义静态变量jwt_expr,用于设置JWT的过期时间(单位:毫秒)
|
|
|
|
|
|
//1、生成token
|
|
|
public static String sign(User user){ // 定义静态方法sign,用于生成用户类型的JWT
|
|
|
|
|
|
//1、指定签名的时候使用的签名算法
|
|
|
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; // 使用HS256算法进行签名
|
|
|
//2、生成签发时间
|
|
|
long nowMillis = System.currentTimeMillis(); // 获取当前时间的毫秒数
|
|
|
Date date = new Date(nowMillis); // 将毫秒数转换为Date对象
|
|
|
|
|
|
//3、创建playLoad的私有声明
|
|
|
Map<String,Object> claims = new HashMap<>(); // 创建一个Map对象,用于存储JWT的负载信息
|
|
|
claims.put("id",user.getId()); // 将用户的ID添加到负载中
|
|
|
claims.put("userName",user.getUserName()); // 将用户名添加到负载中
|
|
|
claims.put("type","USER"); // 添加类型信息到负载中
|
|
|
//4、生成签发人
|
|
|
String subject = user.getUserName(); // 将用户名作为JWT的签发人
|
|
|
|
|
|
JwtBuilder builder = Jwts.builder() // 创建JwtBuilder对象,用于构建JWT
|
|
|
.setClaims(claims) // 设置JWT的负载信息
|
|
|
.setId(UUID.randomUUID().toString()) // 设置JWT的唯一标识符
|
|
|
.setIssuedAt(date) // 设置JWT的签发时间
|
|
|
.setSubject(subject) // 设置JWT的签发人
|
|
|
.signWith(signatureAlgorithm,jwt_secret); // 使用指定的签名算法和密钥对JWT进行签名
|
|
|
//设置过期时间
|
|
|
Date exprDate = new Date(nowMillis + jwt_expr); // 计算JWT的过期时间
|
|
|
builder.setExpiration(exprDate); // 设置JWT的过期时间
|
|
|
return builder.compact(); // 生成并返回JWT字符串
|
|
|
}
|
|
|
|
|
|
|
|
|
//1、生成token
|
|
|
public static String signForStudent(Student student){ // 定义静态方法signForStudent,用于生成学生类型的JWT
|
|
|
|
|
|
//1、指定签名的时候使用的签名算法
|
|
|
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; // 使用HS256算法进行签名
|
|
|
//2、生成签发时间
|
|
|
long nowMillis = System.currentTimeMillis(); // 获取当前时间的毫秒数
|
|
|
Date date = new Date(nowMillis); // 将毫秒数转换为Date对象
|
|
|
|
|
|
//3、创建playLoad的私有声明
|
|
|
Map<String,Object> claims = new HashMap<>(); // 创建一个Map对象,用于存储JWT的负载信息
|
|
|
claims.put("id",student.getId()); // 将学生的ID添加到负载中
|
|
|
claims.put("stuNo",student.getStuNo()); // 将学号添加到负载中
|
|
|
claims.put("type","STUDENT"); // 添加类型信息到负载中
|
|
|
//4、生成签发人
|
|
|
String subject = student.getStuNo(); // 将学号作为JWT的签发人
|
|
|
JwtBuilder builder = Jwts.builder() // 创建JwtBuilder对象,用于构建JWT
|
|
|
.setClaims(claims) // 设置JWT的负载信息
|
|
|
.setId(UUID.randomUUID().toString()) // 设置JWT的唯一标识符
|
|
|
.setIssuedAt(date) // 设置JWT的签发时间
|
|
|
.setSubject(subject) // 设置JWT的签发人
|
|
|
.signWith(signatureAlgorithm,jwt_secret); // 使用指定的签名算法和密钥对JWT进行签名
|
|
|
//设置过期时间
|
|
|
Date exprDate = new Date(nowMillis + jwt_expr); // 计算JWT的过期时间
|
|
|
builder.setExpiration(exprDate); // 设置JWT的过期时间
|
|
|
return builder.compact(); // 生成并返回JWT字符串
|
|
|
}
|
|
|
|
|
|
//2、验证token
|
|
|
public static boolean verify(String token){ // 定义静态方法verify,用于验证JWT是否合法
|
|
|
try {
|
|
|
if(StringUtils.isEmpty(token)){ // 如果token为空,则返回false
|
|
|
return false;
|
|
|
}
|
|
|
Jwts.parser().setSigningKey(jwt_secret).parseClaimsJws(token).getBody(); // 解析JWT并验证签名
|
|
|
return true; // 如果解析成功且签名合法,则返回true
|
|
|
} catch (Exception e) { // 如果解析或验证过程中发生异常,则捕获异常
|
|
|
e.printStackTrace(); // 打印异常堆栈信息
|
|
|
return false; // 返回false表示验证失败
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public static String getType(String token){ // 定义静态方法getType,用于获取JWT的类型信息
|
|
|
try {
|
|
|
if(StringUtils.isEmpty(token)){ // 如果token为空,则抛出自定义异常
|
|
|
throw new MyException("token不能为空");
|
|
|
}
|
|
|
if(verify(token)){ // 如果token验证通过,则解析JWT并获取类型信息
|
|
|
Claims claims = Jwts.parser().setSigningKey(jwt_secret).parseClaimsJws(token).getBody(); // 解析JWT并获取负载信息
|
|
|
return claims.get("type")+""; // 返回类型信息
|
|
|
}else{
|
|
|
throw new MyException("超时或不合法token"); // 如果token验证失败,则抛出自定义异常
|
|
|
}
|
|
|
} catch (Exception e) { // 如果解析或验证过程中发生异常,则捕获异常
|
|
|
throw new MyException("超时或不合法token"); // 抛出自定义异常
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//3、获取用户信息
|
|
|
public static User getUser(String token){ // 定义静态方法getUser,用于从JWT中提取用户信息
|
|
|
try {
|
|
|
if(StringUtils.isEmpty(token)){ // 如果token为空,则抛出自定义异常
|
|
|
throw new MyException("token不能为空");
|
|
|
}
|
|
|
if(verify(token)){ // 如果token验证通过,则解析JWT并获取用户信息
|
|
|
Claims claims = Jwts.parser().setSigningKey(jwt_secret).parseClaimsJws(token).getBody(); // 解析JWT并获取负载信息
|
|
|
User user = new User(); // 创建User对象
|
|
|
user.setId(Integer.parseInt(claims.get("id")+"")); // 从负载中提取用户ID并设置到User对象中
|
|
|
user.setUserName(claims.get("userName")+""); // 从负载中提取用户名并设置到User对象中
|
|
|
return user; // 返回User对象
|
|
|
}else{
|
|
|
throw new MyException("超时或不合法token"); // 如果token验证失败,则抛出自定义异常
|
|
|
}
|
|
|
} catch (Exception e) { // 如果解析或验证过程中发生异常,则捕获异常
|
|
|
throw new MyException("超时或不合法token"); // 抛出自定义异常
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public static Student getStudent(String token){ // 定义静态方法getStudent,用于从JWT中提取学生信息
|
|
|
try {
|
|
|
if(StringUtils.isEmpty(token)){ // 如果token为空,则抛出自定义异常
|
|
|
throw new MyException("token不能为空");
|
|
|
}
|
|
|
if(verify(token)){ // 如果token验证通过,则解析JWT并获取学生信息
|
|
|
Claims claims = Jwts.parser().setSigningKey(jwt_secret).parseClaimsJws(token).getBody(); // 解析JWT并获取负载信息
|
|
|
Student student = new Student(); // 创建Student对象
|
|
|
student.setId(Integer.parseInt(claims.get("id")+"")); // 从负载中提取学生ID并设置到Student对象中
|
|
|
student.setStuNo(claims.get("stuNo")+""); // 从负载中提取学号并设置到Student对象中
|
|
|
return student; // 返回Student对象
|
|
|
}else{
|
|
|
throw new MyException("超时或不合法token"); // 如果token验证失败,则抛出自定义异常
|
|
|
}
|
|
|
} catch (Exception e) { // 如果解析或验证过程中发生异常,则捕获异常
|
|
|
throw new MyException("超时或不合法token"); // 抛出自定义异常
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public static void main(String[] args) { // 主方法,程序入口点
|
|
|
User user = new User(); // 创建User对象
|
|
|
user.setId(1); // 设置用户ID
|
|
|
user.setUserName("admin"); // 设置用户名
|
|
|
System.out.println(sign(user)); // 生成用户类型的JWT并打印输出
|
|
|
}
|
|
|
} |