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