You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
8.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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并打印输出
}
}