Explorar o código

优化小程序登录

baifucheng hai 2 meses
pai
achega
698efa565e

+ 1 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -339,6 +339,7 @@ api-token:
   secret: abcdefghijklmnopqrstuvwxyz
   expireTime: 604800  # 单位秒 (七天7*24*60*60=604800)
   refreshTime: 86400 # 单位秒 (一天1*24*60*60=86400)
+  redisExpireTime: 691200 # 单位秒 (八天8*24*60*60=604800)
 
 # 阿里云短信
 aliyunsample:

+ 10 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/LoginApiInterceptor.java

@@ -55,10 +55,20 @@ public class LoginApiInterceptor implements HandlerInterceptor {
         // 先校验redis中的token是否存在,如果不存在,则直接提示登录过期
         String cacheUserStr = stringRedisTemplate.opsForValue().get(Constants.JWT_TOKEN + accessToken);
         if (ObjectUtil.isEmpty(cacheUserStr)) {
+            //这里抛给前端的为一个自定义异常枚举,可自己定义
+            throw new ServiceException(ExceptionEnum.USER_NOT_LOGIN);
+        }
+        // 验证token是否已过期
+        UserCacheInfo userCacheInfo = JSONUtil.toBean(cacheUserStr, UserCacheInfo.class);
+        if (userCacheInfo.getExpireTime() != null && userCacheInfo.getExpireTime().getTime() < System.currentTimeMillis()) {
+            // 登录过期,删除online token
+            stringRedisTemplate.opsForSet().remove(Constants.JWT_ONLINE_USER_TOKEN + userCacheInfo.getId(), accessToken);
+
             //这里抛给前端的为一个自定义异常枚举,可自己定义
             throw new ServiceException(ExceptionEnum.TOKEN_EXPIRED);
         }
 
+        // jwt校验
         try {
             Claims claims = apiTokenService.getAllClaimsFromToken(accessToken);
 
@@ -73,8 +83,6 @@ public class LoginApiInterceptor implements HandlerInterceptor {
                 throw new ServiceException(ExceptionEnum.USER_DISABLED);
             }
 
-            //这个可要可不要,通过这里自己在请求中加参数,可以让前端少传几个已经在token中自定义好的值
-            UserCacheInfo userCacheInfo = JSONUtil.toBean(cacheUserStr, UserCacheInfo.class);
             user.setTeacherId(userCacheInfo.getTeacherId());
             user.setWorkerId(userCacheInfo.getWorkerId());
             UserContext.setUser(user);

+ 10 - 4
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/ApiTokenService.java

@@ -53,6 +53,9 @@ public class ApiTokenService {
     @Value("${api-token.refreshTime}")
     private int refreshTime;
 
+    @Value("${api-token.redisExpireTime:691200}")
+    private int redisExpireTime;
+
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
 
@@ -122,7 +125,7 @@ public class ApiTokenService {
 
         //  缓存用户信息至redis
         Long userId = (Long) claims.get(Constants.USER_ID);
-        cacheUserInfo(userId, token);
+        cacheUserInfo(userId, token, expirationDate);
 
         return token;
     }
@@ -177,13 +180,13 @@ public class ApiTokenService {
         return getClaimFromToken(token, Claims::getExpiration);
     }
 
-    private void cacheUserInfo(Long userId, String token) {
+    private void cacheUserInfo(Long userId, String token, Date expireTime) {
         UserVo userVo = userService.getUserById(userId, true);
         UserCacheInfo userCacheInfo = BeanCopyUtils.copy(userVo, UserCacheInfo.class);
-
         if (userCacheInfo == null) {
             throw new ServiceException("用户不存在");
         }
+        userCacheInfo.setExpireTime(expireTime);
         // 查询是否为管理老师
         ManagementTeacherDto managementTeacherDto = managementTeacherApi.getByPhoneNumber(userVo.getMobile(), true);
         if (managementTeacherDto != null) {
@@ -196,9 +199,12 @@ public class ApiTokenService {
         }
 
         // 缓存至redis
-        stringRedisTemplate.opsForValue().set(Constants.JWT_TOKEN + token, JSONUtil.toJsonStr(userCacheInfo), expireTime, TimeUnit.SECONDS);
+        stringRedisTemplate.opsForValue().set(Constants.JWT_TOKEN + token, JSONUtil.toJsonStr(userCacheInfo), redisExpireTime, TimeUnit.SECONDS);
+
         // 缓存用户在线用户userId,方便强制踢出
         stringRedisTemplate.opsForSet().add(Constants.JWT_ONLINE_USER_TOKEN + userId, token);
+        // 每次登录,刷新该用户的在线token列表的缓存时间
+        stringRedisTemplate.expire(Constants.JWT_ONLINE_USER_TOKEN + userId, redisExpireTime, TimeUnit.SECONDS);
     }
 
 }

+ 6 - 0
ruoyi-user/src/main/java/com/ruoyi/user/domain/model/UserCacheInfo.java

@@ -1,6 +1,7 @@
 package com.ruoyi.user.domain.model;
 
 import java.io.Serializable;
+import java.util.Date;
 
 import lombok.Data;
 
@@ -38,4 +39,9 @@ public class UserCacheInfo implements Serializable {
      * 护工id
      */
     private Long workerId;
+
+    /**
+     * 过期时间
+     */
+    private Date expireTime;
 }