String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey());
时间: 2024-03-04 18:48:23 浏览: 21
这段代码是用来创建JWT Token的。其中,createJwtTokenWithExpireTimeMinutes是自定义的JWT工具类方法,包含以下参数:
- user:用户对象,包含用户的ID、名称等信息。
- rsaProperties.getPrivateKey():RSA私钥,用于对JWT Token进行签名。
- expiredTime:Token的过期时间。
- BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey():JWT Token中payload部分的key,该值为一个枚举类型,表示JWT Token中存储用户信息的key。
- BusinessConstant.SYSTEM_JWT_ISS.getKey():JWT Token中iss部分的值,该值为一个枚举类型,表示JWT Token的签发人。
通过调用该方法,可以得到一个包含用户信息和过期时间的JWT Token。
相关问题
try { //获取用户载荷 authorizationToken = authorizationToken.substring(7); //检查redis 只要有就继续 Long remainTime = redisUtils.getExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, TimeUnit.SECONDS); if (remainTime <= 0) { throw new AuthorizationException(BusinessCode.NOT_AUTHORIZED.getCode(), BusinessCode.JWT_SIGNATURE_EXCEPTION.getMsg()); } //检查签名 JwtPayLoad<UserVo> payLoadFromJwt = JwtUtils.getPayLoadFromJwt(authorizationToken, publicKey, UserVo.class, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey()); //redis续期时间 min long now = System.currentTimeMillis(); long jwtExpiredTime = payLoadFromJwt.getExpiredTime().getTime(); long reNewTime = Long.parseLong(BusinessConstant.JWT_RENEW_TIME.getKey()) * 60 * 1000; //判断是否需要续期 if (jwtExpiredTime - now <= reNewTime) { //获取旧的用户属性 UserVo user = payLoadFromJwt.getPayLoadData(); //过期时间 int expiredTime = Integer.parseInt(BusinessConstant.JWT_EXPIRED_TIME.getKey()); String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey()); redisUtils.setNewAndDeleteOldWithExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() + jwtTokenWithExpireTimeMinutes, user.getName() + ":" + user.getUserId(),BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, expiredTime, TimeUnit.MINUTES); response.setHeader(BusinessConstant.JWT_REQUEST_HEAD.getKey(), jwtTokenWithExpireTimeMinutes); log.info("====客户端:" + ipAddr + " 用户:" + user.getName() + " -- (" + user.getUserId() + ") token续期成功!!!!"); }
这段代码是一个 Java 代码块,其中包含了一些逻辑代码。这段代码主要是用于实现用户认证和 JWT Token 的续期功能。下面是对代码块中各行代码的解释:
1. `authorizationToken = authorizationToken.substring(7);`:从请求头中获取 JWT Token,去掉前缀 "Bearer ",并将其赋值给变量 authorizationToken。
2. `Long remainTime = redisUtils.getExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, TimeUnit.SECONDS);`:从 Redis 中获取 JWT Token 的剩余过期时间,单位为秒,并将其赋值给变量 remainTime。
3. `if (remainTime <= 0) {throw new AuthorizationException(BusinessCode.NOT_AUTHORIZED.getCode(), BusinessCode.JWT_SIGNATURE_EXCEPTION.getMsg());}`:如果 JWT Token 已经过期,则抛出一个自定义异常 AuthorizationException,该异常包含了错误码和错误信息。
4. `JwtPayLoad<UserVo> payLoadFromJwt = JwtUtils.getPayLoadFromJwt(authorizationToken, publicKey, UserVo.class, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey());`:使用公钥 publicKey 解析 JWT Token,并获取其中的 Payload 数据,即 JWT Token 中携带的用户信息。
5. `long jwtExpiredTime = payLoadFromJwt.getExpiredTime().getTime();`:从 Payload 中获取 JWT Token 的过期时间,并将其赋值给变量 jwtExpiredTime。
6. `long reNewTime = Long.parseLong(BusinessConstant.JWT_RENEW_TIME.getKey()) * 60 * 1000;`:从配置文件中获取 JWT Token 续期时间,单位为分钟,并将其转换为毫秒,并将其赋值给变量 reNewTime。
7. `if (jwtExpiredTime - now <= reNewTime) {...}`:如果 JWT Token 的过期时间与当前时间的差值小于等于续期时间,则进行续期操作。
8. `UserVo user = payLoadFromJwt.getPayLoadData();`:从 Payload 中获取用户信息,并将其赋值给变量 user。
9. `int expiredTime = Integer.parseInt(BusinessConstant.JWT_EXPIRED_TIME.getKey());`:从配置文件中获取 JWT Token 的过期时间,单位为分钟,并将其转换为整数,并将其赋值给变量 expiredTime。
10. `String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey());`:使用私钥 rsaProperties.getPrivateKey() 生成新的 JWT Token,并指定其过期时间和 Payload 数据。
11. `redisUtils.setNewAndDeleteOldWithExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() + jwtTokenWithExpireTimeMinutes, user.getName() + ":" + user.getUserId(), BusinessConstant.JWT_REDIS_KEY.getKey() + authorizationToken, expiredTime, TimeUnit.MINUTES);`:将新生成的 JWT Token 和 Redis 中旧的 JWT Token 进行替换,并设置过期时间为 expiredTime 分钟。
12. `response.setHeader(BusinessConstant.JWT_REQUEST_HEAD.getKey(), jwtTokenWithExpireTimeMinutes);`:将新生成的 JWT Token 放入响应头中,以便客户端获取。
13. `log.info("====客户端:" + ipAddr + " 用户:" + user.getName() + " -- (" + user.getUserId() + ") token续期成功!!!!");`:记录续期操作的日志信息,包括客户端 IP 地址、用户名称和用户 ID。
else if (role.equals(UserType.TEACHER_USER.getCode())) { //若不是管理员,检查是不是老师 TeacherEntity teacherRes = loginService.teacherLogin(username, password); Optional.ofNullable(teacherRes).orElseThrow(() -> { return new BusinessCodeException(BusinessCode.USER_LOGIN_FAILURE.getMsg(), BusinessCode.USER_LOGIN_FAILURE.getCode()); }); UserVo userVo = new UserVo(); //封装页面用户实体 UserVo user = userVo.setUserId(teacherRes.getTeacherId()).setName(teacherRes.getTeacherName()).setRole(UserType.TEACHER_USER.getCode()); //生成jwt //过期时间 int expiredTime = Integer.parseInt(BusinessConstant.JWT_EXPIRED_TIME.getKey()); //分钟过期 String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey()); //设置redis过期时间 --测试(分钟) redisUtils.setKeyAndSetExpireTime(BusinessConstant.JWT_REDIS_KEY.getKey() + jwtTokenWithExpireTimeMinutes, user.getName() + ":" + user.getUserId(), expiredTime, TimeUnit.MINUTES); //返回token response.setHeader(BusinessConstant.JWT_REQUEST_HEAD.getKey(),jwtTokenWithExpireTimeMinutes); //封装返回类型 return ApiResultHandler.successResult(user); }
这段代码是用于用户登录验证的,如果登录的用户类型是老师,则调用 `loginService.teacherLogin(username, password)` 方法进行验证,如果验证成功,则将用户信息封装成一个 `UserVo` 对象,并生成一个 JWT token,然后将 token 放在响应头中返回。同时,将 token 存储到 Redis 中以便后续验证用户身份。最后,返回一个成功的响应结果,其中包含了用户信息。