deason 7 ani în urmă
părinte
comite
97aad08c60

+ 4 - 4
pom.xml

@@ -104,10 +104,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
-        <!--<dependency>
-            <groupId>org.springframework.session</groupId>
-            <artifactId>spring-session-data-redis</artifactId>
-        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
         <!--<dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>

+ 10 - 11
src/main/java/cn/com/qmth/examcloud/app/controller/version_1_0/UserAuthRestController.java

@@ -7,8 +7,11 @@
 
 package cn.com.qmth.examcloud.app.controller.version_1_0;
 
+import cn.com.qmth.examcloud.app.core.utils.StrUtils;
 import cn.com.qmth.examcloud.app.model.Result;
 import cn.com.qmth.examcloud.app.model.UserInfo;
+import cn.com.qmth.examcloud.app.model.UserToken;
+import cn.com.qmth.examcloud.app.service.RedisService;
 import cn.com.qmth.examcloud.app.service.UserAuthService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -17,9 +20,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-
 import static cn.com.qmth.examcloud.app.model.Constants.COMMON_ACCOUNT_TYPE;
+import static cn.com.qmth.examcloud.app.model.Constants.REDIS_EXPIRE_TIME;
 
 /**
  * 认证中心相关接口
@@ -33,11 +35,13 @@ public class UserAuthRestController {
     private final static Logger log = LoggerFactory.getLogger(UserAuthRestController.class);
     @Autowired
     private UserAuthService userAuthService;
+    @Autowired
+    private RedisService redisService;
 
     @ApiOperation(value = "登录接口")
     @RequestMapping(value = "/user/login", method = {RequestMethod.GET, RequestMethod.POST})
     public Result<UserInfo> login(@RequestParam String account, @RequestParam String password, @RequestParam(required = false) String accountType,
-                                  @RequestParam(required = false) Long rootOrgId, @RequestParam(required = false) String domain, HttpServletRequest request) throws Exception {
+                                  @RequestParam(required = false) Long rootOrgId, @RequestParam(required = false) String domain) throws Exception {
         if (accountType == null) {
             accountType = COMMON_ACCOUNT_TYPE;
         }
@@ -46,15 +50,10 @@ public class UserAuthRestController {
             //获取当前登录用户信息
             UserInfo userInfo = result.getData();
             UserToken userToken = new UserToken(account, password, accountType, rootOrgId, domain, userInfo.getKey(), userInfo.getToken());
-
-            //存放登录信息到Session中
+            //将登录信息存放到Redis中
             String sessionKey = StrUtils.uuid();
-            HttpSession session = request.getSession();
-            //session.setMaxInactiveInterval(EXPIRE_TIME);
-            session.setMaxInactiveInterval(60);
-            session.setAttribute(sessionKey, userToken);
-            log.debug("token:" + userToken.getToken() + " sessionId:" + sessionKey);
-
+            redisService.cacheUserToken(sessionKey, userToken, REDIS_EXPIRE_TIME);
+            log.debug("token:" + userToken.getToken() + " sessionKey:" + sessionKey);
             //替换Token为本地SessionKey
             userInfo.setToken(sessionKey);
         }*/

+ 15 - 11
src/main/java/cn/com/qmth/examcloud/app/core/config/AccessInterceptor.java

@@ -8,7 +8,11 @@
 package cn.com.qmth.examcloud.app.core.config;
 
 import cn.com.qmth.examcloud.app.model.DeviceRecord;
+import cn.com.qmth.examcloud.app.model.Result;
+import cn.com.qmth.examcloud.app.model.UserInfo;
+import cn.com.qmth.examcloud.app.model.UserToken;
 import cn.com.qmth.examcloud.app.service.DeviceRecordService;
+import cn.com.qmth.examcloud.app.service.RedisService;
 import cn.com.qmth.examcloud.app.service.UserAuthService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -21,7 +25,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
 import java.util.Map;
 
-import static cn.com.qmth.examcloud.app.model.Constants.PASSWORD;
+import static cn.com.qmth.examcloud.app.model.Constants.*;
 
 public class AccessInterceptor extends HandlerInterceptorAdapter {
     private final static Logger log = LoggerFactory.getLogger(AccessInterceptor.class);
@@ -29,28 +33,28 @@ public class AccessInterceptor extends HandlerInterceptorAdapter {
     private DeviceRecordService deviceRecordService;
     @Autowired
     private UserAuthService userAuthService;
+    @Autowired
+    private RedisService redisService;
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         DeviceRecord record = this.parseParams(request);
-        /*if (StringUtils.isNotEmpty(record.getLoginToken())) {
-            //带Token时则需要认证
-            HttpSession session = request.getSession();
-            System.out.println(record.getLoginToken() + " " + session.getMaxInactiveInterval());
-
-            //获取原来的登录信息,并判断是否再有效时间内
-            UserToken userToken = (UserToken) session.getAttribute(record.getLoginToken());
-            if (userToken != null && !userToken.hasExpired()) {
-                //登录已失效,则Token续期
+        /*String sessionKey = record.getLoginToken();
+        if (StringUtils.isNotBlank(sessionKey)) {
+            //获取原来的登录信息,并判断Token是否在有效时间内
+            UserToken userToken = redisService.getUserToken(sessionKey);
+            if (userToken != null && userToken.hasExpired(PLATFORM_EXPIRED)) {
+                //已登录过但Token已失效,则自动续期
                 Result<UserInfo> result = userAuthService.login(userToken.getAccount(), userToken.getPassword(),
                         userToken.getAccountType(), userToken.getRootOrgId(), userToken.getDomain());
                 UserInfo userInfo = result.getData();
                 if (userInfo != null) {
                     log.debug("new token is " + userInfo.getToken());
                     userToken.setToken(userInfo.getToken());
-                    session.setAttribute(record.getLoginToken(), userToken);
+                    redisService.cacheUserToken(sessionKey, userToken, REDIS_EXPIRE_TIME);
                 }
             }
+            //else null 则代表未登录过
         }*/
         //异步保存设备访问记录
         deviceRecordService.addDeviceRecord(record);

+ 0 - 6
src/main/java/cn/com/qmth/examcloud/app/core/config/RedisConfig.java

@@ -1,6 +0,0 @@
-package cn.com.qmth.examcloud.app.core.config;
-
-//@Configuration
-public class RedisConfig {
-
-}

+ 6 - 2
src/main/java/cn/com/qmth/examcloud/app/model/Constants.java

@@ -9,8 +9,12 @@ package cn.com.qmth.examcloud.app.model;
 
 public interface Constants {
 
-    /* Session的过期时长,单位为秒 */
-    int EXPIRE_TIME = 720 * 60 * 60;
+    /* 过期时长,单位为秒 */
+    int REDIS_EXPIRE_TIME = 3600 * 24 * 30;//一个月
+
+    String REDIS_KEY_PREFIX = "appSessionUser:";
+
+    int PLATFORM_EXPIRED = 2;//平台端的默认过期时间(小时)
 
     String CHARSET_JSON_UTF8 = "application/json; charset=utf-8";
 

+ 5 - 5
src/main/java/cn/com/qmth/examcloud/app/model/UserToken.java

@@ -31,15 +31,15 @@ public class UserToken implements Serializable {
 
     }
 
-    public boolean hasExpired() {
+    public boolean hasExpired(int hours) {
         if (createTime == null) {
             return true;
         }
         Calendar c = Calendar.getInstance();
-        c.setTime(new Date());
-        c.set(Calendar.HOUR, 2);
-        //判断是否在2小时内
-        if (c.getTime().before(createTime)) {
+        c.setTime(createTime);
+        c.set(Calendar.HOUR, hours);
+        //判断是否在n小时内
+        if (c.getTime().after(new Date())) {
             return false;
         }
         return true;

+ 53 - 0
src/main/java/cn/com/qmth/examcloud/app/service/RedisService.java

@@ -0,0 +1,53 @@
+package cn.com.qmth.examcloud.app.service;
+
+import cn.com.qmth.examcloud.app.core.utils.JsonMapper;
+import cn.com.qmth.examcloud.app.model.UserToken;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+import static cn.com.qmth.examcloud.app.model.Constants.REDIS_KEY_PREFIX;
+
+@Service
+public class RedisService {
+    private static Logger log = LoggerFactory.getLogger(RedisService.class);
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    public void set(String key, String value) {
+        redisTemplate.opsForValue().set(key, value);
+    }
+
+    public void set(String key, String value, long seconds) {
+        redisTemplate.opsForValue().set(key, value, seconds, TimeUnit.SECONDS);
+    }
+
+    public String get(String key) {
+        return redisTemplate.opsForValue().get(key);
+    }
+
+    public boolean exist(String key) {
+        return redisTemplate.hasKey(key);
+    }
+
+    public void delete(String key) {
+        redisTemplate.delete(key);
+    }
+
+    public void cacheUserToken(String key, UserToken value, long seconds) {
+        this.set(REDIS_KEY_PREFIX + key, new JsonMapper().toJson(value), seconds);
+    }
+
+    public UserToken getUserToken(String key) {
+        String value = this.get(REDIS_KEY_PREFIX + key);
+        if (value != null) {
+            return new JsonMapper().fromJson(value, UserToken.class);
+        }
+        return null;
+    }
+
+}

+ 7 - 1
src/main/resources/application-dev.properties

@@ -17,8 +17,14 @@ spring.datasource.url=jdbc:mysql://192.168.10.30:3306/app_api?useUnicode=true&ch
 spring.datasource.username=root
 spring.datasource.password=root
 spring.datasource.driverClassName=com.mysql.jdbc.Driver
-spring.jpa.show-sql=true
+spring.jpa.show-sql=false
 spring.jpa.hibernate.ddl-auto=update
+#redis config
+spring.redis.port=6379
+spring.redis.host=192.168.10.30
+spring.redis.password=
+spring.redis.database=0
+spring.redis.timeout=PT15S
 # 蕉昢督昢華硊
 examcloud.exam.admin.url=http://192.168.10.30:8001
 # 厙蕉督昢華硊

+ 6 - 0
src/main/resources/application-prod.properties

@@ -19,6 +19,12 @@ spring.datasource.password=root
 spring.datasource.driverClassName=com.mysql.jdbc.Driver
 spring.jpa.show-sql=false
 spring.jpa.hibernate.ddl-auto=update
+#redis config
+spring.redis.port=6379
+spring.redis.host=192.168.10.30
+spring.redis.password=
+spring.redis.database=0
+spring.redis.timeout=PT15S
 # 蕉昢督昢華硊
 examcloud.exam.admin.url=http://192.168.10.30:8001
 # 厙蕉督昢華硊

+ 7 - 1
src/main/resources/application-test.properties

@@ -17,8 +17,14 @@ spring.datasource.url=jdbc:mysql://192.168.10.30:3306/app_api?useUnicode=true&ch
 spring.datasource.username=root
 spring.datasource.password=root
 spring.datasource.driverClassName=com.mysql.jdbc.Driver
-spring.jpa.show-sql=true
+spring.jpa.show-sql=false
 spring.jpa.hibernate.ddl-auto=update
+#redis config
+spring.redis.port=6379
+spring.redis.host=192.168.10.30
+spring.redis.password=
+spring.redis.database=0
+spring.redis.timeout=PT15S
 # 蕉昢督昢華硊
 examcloud.exam.admin.url=http://192.168.10.30:8001
 # 厙蕉督昢華硊

+ 6 - 1
src/test/java/cn/com/qmth/examcloud/app/SimpleTest.java

@@ -2,11 +2,16 @@ package cn.com.qmth.examcloud.app;
 
 import org.junit.Test;
 
+import java.time.Duration;
+
 public class SimpleTest {
 
     @Test
     public void demo() throws Exception {
-
+        System.out.println(Duration.ofSeconds(1));
+        System.out.println(Duration.ofMinutes(1));
+        System.out.println(Duration.ofHours(1));
+        System.out.println(Duration.ofDays(1));
     }
 
 }