deason 7 년 전
부모
커밋
9f5fd99685

+ 4 - 0
src/main/java/cn/com/qmth/examcloud/app/controller/IndexController.java

@@ -11,6 +11,10 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
+/**
+ * @author: fengdesheng
+ * @since: 2018/7/16
+ */
 @Controller
 public class IndexController {
 

+ 3 - 1
src/main/java/cn/com/qmth/examcloud/app/controller/version_1_0/OfflineExamController.java

@@ -26,7 +26,9 @@ import javax.servlet.http.HttpServletRequest;
 /**
  * 离线考试相关接口
  *
- * @Version v1.0
+ * @version v1.0
+ * @author: fengdesheng
+ * @since: 2018/7/16
  */
 @Controller
 @RequestMapping("/api/v1/exam/offline")

+ 3 - 1
src/main/java/cn/com/qmth/examcloud/app/controller/version_1_0/PracticeExamRestController.java

@@ -18,7 +18,9 @@ import org.springframework.web.bind.annotation.*;
 /**
  * 在线练习相关接口
  *
- * @Version v1.0
+ * @version v1.0
+ * @author: fengdesheng
+ * @since: 2018/7/16
  */
 @RestController
 @RequestMapping("/api/v1")

+ 3 - 1
src/main/java/cn/com/qmth/examcloud/app/controller/version_1_0/SystemRestController.java

@@ -18,7 +18,9 @@ import org.springframework.web.bind.annotation.*;
 /**
  * 系统服务相关接口
  *
- * @Version v1.0
+ * @version v1.0
+ * @author: fengdesheng
+ * @since: 2018/7/16
  */
 @RestController
 @RequestMapping("/api/v1")

+ 14 - 8
src/main/java/cn/com/qmth/examcloud/app/controller/version_1_0/UserAuthRestController.java

@@ -20,13 +20,17 @@ 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;
 
 /**
  * 认证中心相关接口
  *
- * @Version v1.0
+ * @version v1.0
+ * @author: fengdesheng
+ * @since: 2018/7/16
  */
 @RestController
 @RequestMapping("/api/v1")
@@ -49,13 +53,14 @@ public class UserAuthRestController {
         /*if (result.isSuccess()) {
             //获取当前登录用户信息
             UserInfo userInfo = result.getData();
+            //封装原始登录信息
             UserToken userToken = new UserToken(account, password, accountType, rootOrgId, domain, userInfo.getKey(), userInfo.getToken());
-            //将登录信息存放到Redis中
-            String sessionKey = StrUtils.md5Key(userInfo.getKey());
-            redisService.cacheUserToken(sessionKey, userToken, REDIS_EXPIRE_TIME);
-            log.debug("token:" + userToken.getToken() + " sessionKey:" + sessionKey);
-            //替换Token为本地SessionKey
-            userInfo.setToken(sessionKey);
+            //将原始登录信息存放到Redis中
+            String redisKey = StrUtils.md5Key(userInfo.getKey());
+            redisService.cacheUserToken(redisKey, userToken, REDIS_EXPIRE_TIME);
+            log.debug("redisKey:" + redisKey + " loginToken:" + userToken.getToken());
+            //替换login token为缓存的redisKey,并作为接口的结果返回
+            userInfo.setToken(redisKey);
         }*/
         return result;
     }
@@ -68,7 +73,8 @@ public class UserAuthRestController {
 
     @ApiOperation(value = "获取用户信息接口")
     @RequestMapping(value = "/user/info", method = {RequestMethod.GET, RequestMethod.POST})
-    public Result getUserInfo(@RequestHeader String key, @RequestHeader String token) throws Exception {
+    public Result getUserInfo(@RequestHeader String key, @RequestHeader String token, HttpServletRequest request) throws Exception {
+        //String loginToken = (String) request.getAttribute("loginToken");
         return userAuthService.getUserInfo(key, token);
     }
 

+ 25 - 14
src/main/java/cn/com/qmth/examcloud/app/core/config/AccessInterceptor.java

@@ -27,6 +27,10 @@ import java.util.Map;
 
 import static cn.com.qmth.examcloud.app.model.Constants.*;
 
+/**
+ * @author: fengdesheng
+ * @since: 2018/7/16
+ */
 public class AccessInterceptor extends HandlerInterceptorAdapter {
     private final static Logger log = LoggerFactory.getLogger(AccessInterceptor.class);
     @Autowired
@@ -39,22 +43,29 @@ public class AccessInterceptor extends HandlerInterceptorAdapter {
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         DeviceRecord record = this.parseParams(request);
-        /*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());
-                    redisService.cacheUserToken(sessionKey, userToken, REDIS_EXPIRE_TIME);
+        //用户带的login token实际为缓存的redisKey
+        /*String redisKey = record.getLoginToken();
+        if (StringUtils.isNotBlank(redisKey)) {
+            //通过redisKey获取原始的登录信息
+            UserToken userToken = redisService.getUserToken(redisKey);
+            if (userToken != null) {
+                //判断原始的login token是否在有效时间内
+                if (userToken.hasExpired(PLATFORM_EXPIRED)) {
+                    //已超过有效时间,则自动登录续期
+                    Result<UserInfo> result = userAuthService.login(userToken.getAccount(), userToken.getPassword(),
+                            userToken.getAccountType(), userToken.getRootOrgId(), userToken.getDomain());
+                    UserInfo userInfo = result.getData();
+                    if (userInfo != null) {
+                        //登录成功后缓存新的login token
+                        log.debug("redisKey:" + redisKey + " newLoginToken:" + userToken.getToken());
+                        userToken.setToken(userInfo.getToken());
+                        redisService.cacheUserToken(redisKey, userToken, REDIS_EXPIRE_TIME);
+                    }
                 }
+                //将login token绑定到request请求中
+                request.setAttribute("loginToken", userToken.getToken());
             }
-            //else null 则代表未登录过
+            //else null 则代表未登录
         }*/
         //异步保存设备访问记录
         deviceRecordService.addDeviceRecord(record);

+ 94 - 0
src/main/java/cn/com/qmth/examcloud/app/core/utils/ThreadUtils.java

@@ -0,0 +1,94 @@
+package cn.com.qmth.examcloud.app.core.utils;
+
+import com.google.common.collect.Maps;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 线程工具
+ *
+ * @author: fengdesheng
+ * @since: 2018/7/16
+ */
+public class ThreadUtils {
+
+    /**
+     * 属性注释
+     */
+    private static final ThreadLocal<String> LOCAL_TRACE_ID = new ThreadLocal<String>() {
+        @Override
+        public String initialValue() {
+            return null;
+        }
+    };
+
+    /**
+     * 属性注释
+     */
+    private static final ThreadLocal<Map<String, Object>> LOCAL_TRACE_MAP = new ThreadLocal<Map<String, Object>>() {
+        @Override
+        public Map<String, Object> initialValue() {
+            return null;
+        }
+    };
+
+    /**
+     * 重新初始化
+     */
+    public static String next() {
+        LOCAL_TRACE_MAP.set(null);
+        String traceID = UUID.randomUUID().toString().replace("-", "");
+        setTraceID(traceID);
+        return traceID;
+    }
+
+    /**
+     * 方法注释
+     */
+    public static String getTraceID() {
+        String traceID = LOCAL_TRACE_ID.get();
+        if (traceID == null) {
+            traceID = next();
+        } else {
+            return traceID;
+        }
+
+        return traceID;
+    }
+
+    /**
+     * 方法注释
+     */
+    public static void setTraceID(String traceID) {
+        if (!(StringUtils.isNotBlank(traceID)))
+            return;
+        LOCAL_TRACE_ID.set(traceID);
+    }
+
+    /**
+     * 方法注释
+     */
+    public static void set(String key, Object value) {
+        Map<String, Object> map = LOCAL_TRACE_MAP.get();
+
+        if (null == map) {
+            map = Maps.newHashMap();
+            LOCAL_TRACE_MAP.set(map);
+        }
+        map.put(key, value);
+    }
+
+    /**
+     * 方法注释
+     */
+    public static Object get(String key) {
+        Map<String, Object> map = LOCAL_TRACE_MAP.get();
+        if (null == map) {
+            return null;
+        }
+        return map.get(key);
+    }
+
+}

+ 4 - 0
src/main/java/cn/com/qmth/examcloud/app/dao/DeviceRecordRepository.java

@@ -11,6 +11,10 @@ import cn.com.qmth.examcloud.app.model.DeviceRecord;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
+/**
+ * @author: fengdesheng
+ * @since: 2018/7/16
+ */
 public interface DeviceRecordRepository extends PagingAndSortingRepository<DeviceRecord, Long>, JpaSpecificationExecutor<DeviceRecord> {
 
 }

+ 8 - 0
src/main/java/cn/com/qmth/examcloud/app/model/Constants.java

@@ -7,6 +7,12 @@
 
 package cn.com.qmth.examcloud.app.model;
 
+/**
+ * 系统常量
+ *
+ * @author: fengdesheng
+ * @since: 2018/7/16
+ */
 public interface Constants {
 
     /* 过期时长,单位为秒 */
@@ -16,6 +22,8 @@ public interface Constants {
 
     int PLATFORM_EXPIRED = 2;//平台端的默认过期时间(小时)
 
+    String SESSION_TIMEOUT = "$_SESSION_TIMEOUT";
+
     String CHARSET_JSON_UTF8 = "application/json; charset=utf-8";
 
     String PARAM_KEY = "key";

+ 202 - 0
src/main/java/cn/com/qmth/examcloud/app/model/User.java

@@ -0,0 +1,202 @@
+/*
+ * *************************************************
+ * Copyright (c) 2018 QMTH. All Rights Reserved.
+ * Created by Deason on 2018-07-31 13:38:37.
+ * *************************************************
+ */
+
+package cn.com.qmth.examcloud.app.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author: fengdesheng
+ * @since: 2018/7/16
+ */
+public class User implements Serializable {
+    private static final long serialVersionUID = 8766713125414955078L;
+
+    /**
+     * 全局唯一标识符
+     */
+    private String key;
+
+    /**
+     * 用户类型
+     */
+    private String userType;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 显示名
+     */
+    private String displayName;
+
+    /**
+     * 顶级机构ID
+     */
+    private Long rootOrgId;
+
+    /**
+     * 顶级机构(学校)名称
+     */
+    private String rootOrgName;
+
+    /**
+     * 学习中心ID
+     */
+    private Long orgId;
+
+    /**
+     * 学习中心名称
+     */
+    private String orgName;
+
+    /**
+     * 鉴权token
+     */
+    private String token;
+
+    /**
+     * 鉴权token创建时间
+     */
+    private Date tokenCreationTime;
+
+    /**
+     * 学号
+     */
+    private String studentCode;
+
+    /**
+     * 学生ID
+     */
+    private Long studentId;
+
+    /**
+     * 身份证号
+     */
+    private String identityNumber;
+
+    /**
+     * 由 key+":"+token 拼接
+     */
+    private String userToken;
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getDisplayName() {
+        return displayName;
+    }
+
+    public void setDisplayName(String displayName) {
+        this.displayName = displayName;
+    }
+
+    public Long getRootOrgId() {
+        return rootOrgId;
+    }
+
+    public void setRootOrgId(Long rootOrgId) {
+        this.rootOrgId = rootOrgId;
+    }
+
+    public String getRootOrgName() {
+        return rootOrgName;
+    }
+
+    public void setRootOrgName(String rootOrgName) {
+        this.rootOrgName = rootOrgName;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public Date getTokenCreationTime() {
+        return tokenCreationTime;
+    }
+
+    public void setTokenCreationTime(Date tokenCreationTime) {
+        this.tokenCreationTime = tokenCreationTime;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getIdentityNumber() {
+        return identityNumber;
+    }
+
+    public void setIdentityNumber(String identityNumber) {
+        this.identityNumber = identityNumber;
+    }
+
+    public String getUserToken() {
+        return userToken;
+    }
+
+    public void setUserToken(String userToken) {
+        this.userToken = userToken;
+    }
+
+}

+ 7 - 0
src/main/java/cn/com/qmth/examcloud/app/model/UserInfo.java

@@ -1,3 +1,10 @@
+/*
+ * *************************************************
+ * Copyright (c) 2018 QMTH. All Rights Reserved.
+ * Created by Deason on 2018-07-31 14:32:37.
+ * *************************************************
+ */
+
 package cn.com.qmth.examcloud.app.model;
 
 import java.io.Serializable;

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

@@ -1,3 +1,10 @@
+/*
+ * *************************************************
+ * Copyright (c) 2018 QMTH. All Rights Reserved.
+ * Created by Deason on 2018-07-31 14:32:47.
+ * *************************************************
+ */
+
 package cn.com.qmth.examcloud.app.model;
 
 import java.io.Serializable;