From b6dee87c91bfdcb68fcc456c9a2ec46b2ed7cbe3 Mon Sep 17 00:00:00 2001
From: dangsn <dangsn@chicecm.com>
Date: 星期二, 11 六月 2024 12:33:35 +0800
Subject: [PATCH] 登录和权限校验功能

---
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java                      |    6 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/CacheNameConstant.java                         |    5 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java |  139 ++++++++++-
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/SessionInfo.java                 |   19 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/bo/LoginResultBO.java                                   |   29 +-
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java    |   59 +++-
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java                      |    4 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java                      |  101 +-------
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/LoginServiceI.java                              |   28 --
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/WebUtil.java                                       |    4 
 Source/plt-web/plt-web-parent/plt-web-base/pom.xml                                                                      |    5 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java                 |    4 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LoginController.java                         |    6 
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/VConstant.java                    |   99 ++++++++
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciDateUtil.java                      |    9 
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/ControllerUtil.java                   |   36 ++
 /dev/null                                                                                                               |   40 ---
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java                   |    8 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java                     |    4 
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/TokenKeyConstant.java             |    6 
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSessionForLoginI.java       |   29 ++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java                       |   14 -
 Source/plt-web/plt-web-parent/plt-web/src/main/resources/application-dev.yml                                            |    7 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java                   |    2 
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/WebThreadLocalUtil.java               |   33 +
 25 files changed, 434 insertions(+), 262 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web-base/pom.xml b/Source/plt-web/plt-web-parent/plt-web-base/pom.xml
index 3b0dbc6..c39c2fe 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/pom.xml
+++ b/Source/plt-web/plt-web-parent/plt-web-base/pom.xml
@@ -51,6 +51,11 @@
             <artifactId>jjwt</artifactId>
             <version>0.9.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>transmittable-thread-local</artifactId>
+            <version>2.12.6</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/TokenKeyConstant.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/TokenKeyConstant.java
index e3baafd..033cab1 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/TokenKeyConstant.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/TokenKeyConstant.java
@@ -45,7 +45,7 @@
     /**
      * 浠ょ墝绉橀挜
      */
-    public static final String SECRET = "thisissecretforjwt";
+    public static final String SECRET = "THISISAJWTTOKENKEYBELONGINGTOHONGBO";
 
     /**
      * JWT涓殑鐢ㄦ埛涓婚敭鐨凨ey
@@ -55,7 +55,7 @@
     /**
      * JWT涓璽oken鐨刱ey
      */
-    public static final String JWT_TOKEN_KEY = "token_key";
+    public static final String JWT_TOKEN_KEY = "jwt_token_key";
 
     /**
      * JWT涓敤鎴疯处鍙风殑key
@@ -71,4 +71,6 @@
      * 缂撳瓨鏈夋晥鏈燂紝榛樿30锛堝垎閽燂級
      */
     public static final long EXPIRATION = 30;
+
+
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/VConstant.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/VConstant.java
new file mode 100644
index 0000000..e9c2ddd
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/VConstant.java
@@ -0,0 +1,99 @@
+package com.vci.starter.web.constant;
+
+/**
+ * @Description 甯哥敤鐨勫父閲�
+ * @Author dangsn
+ * @Date 2024/6/11 10:44
+ */
+public class VConstant {
+    /**
+     * UTF-8 瀛楃闆�
+     */
+    public static final String UTF8 = "UTF-8";
+
+    /**
+     * GBK 瀛楃闆�
+     */
+    public static final String GBK = "GBK";
+
+    /**
+     * 鏂滄潬
+     */
+    public static final String PATH_SEP = "/";
+
+    /**
+     * LDAP 杩滅▼鏂规硶璋冪敤
+     */
+    public static final String LOOKUP_LDAP = "ldap:";
+
+    /**
+     * LDAPS 杩滅▼鏂规硶璋冪敤
+     */
+    public static final String LOOKUP_LDAPS = "ldaps:";
+
+    /**
+     * http璇锋眰
+     */
+    public static final String HTTP = "http://";
+
+    /**
+     * https璇锋眰
+     */
+    public static final String HTTPS = "https://";
+
+    /**
+     * 鎴愬姛鏍囪
+     */
+    public static final Integer SUCCESS = 200;
+
+    /**
+     * 澶辫触鏍囪
+     */
+    public static final Integer FAIL = 500;
+
+    /**
+     * 鐧诲綍鎴愬姛
+     */
+    public static final String LOGIN_SUCCESS = "Success";
+
+    /**
+     * 娉ㄩ攢
+     */
+    public static final String LOGOUT = "Logout";
+
+    /**
+     * 娉ㄥ唽
+     */
+    public static final String REGISTER = "Register";
+
+    /**
+     * 鐧诲綍澶辫触
+     */
+    public static final String LOGIN_FAIL = "Error";
+
+    /**
+     * 鍙傛暟绠$悊 cache key
+     */
+    public static final String SYS_CONFIG_KEY = "sys_config:";
+
+    /**
+     * 鏋氫妇绠$悊 cache key
+     */
+    public static final String SYS_ENUM_KEY = "sys_enum:";
+
+    /**
+     * 璧勬簮鏄犲皠璺緞 鍓嶇紑
+     */
+    public static final String RESOURCE_PREFIX = "/profile";
+
+    /**
+     * 瀹氭椂浠诲姟鐧藉悕鍗曢厤缃紙浠呭厑璁歌闂殑鍖呭悕锛屽鍏朵粬闇�瑕佸彲浠ヨ嚜琛屾坊鍔狅級
+     */
+    public static final String[] JOB_WHITELIST_STR = { "com.vci" };
+
+    /**
+     * 瀹氭椂浠诲姟杩濊鐨勫瓧绗�
+     */
+    public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
+            "org.springframework", "org.apache" };
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java
index 5be623c..932537b 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java
@@ -72,36 +72,32 @@
         if(!(handler instanceof  HandlerMethod)){
             return true;
         }
-        List<String> unCheckUrls = new ArrayList<>();
-        if(springMVCConfig !=null && springMVCConfig.getUnCheckUrls() !=null){
-            unCheckUrls = springMVCConfig.getUnCheckUrls();
-        }
-        SessionInfo sessionInfo = null;
-        if(StringUtils.isNotBlank(userToken)){
-            try{
-                sessionInfo = sessionForLoginI.getSessionInfoByToken(userToken);
-            }catch (Throwable e){
-                logger.error("鑾峰彇token鍑洪敊",e);
-                //sendErrorMsg(response,"鑾峰彇token鐨勪俊鎭嚭閿欙紝" + userToken + "," + LangBaseUtil.getErrorMsg(e),1);
-                //return false;
-            }
-            if(sessionInfo!=null){
-                WebThreadLocalUtil.getCurrentUserSessionInfoInThread().set(sessionInfo);
-            }
-        }
+
+        boolean unCheckLogin = false;
         if(handler instanceof  HandlerMethod) {
             HandlerMethod hm = (HandlerMethod)handler;
             Method method = hm.getMethod();
             //璁剧疆浜嗕笉鏍¢獙鐨勪細鐩存帴杩斿洖true
             if (method.isAnnotationPresent(VciUnCheckRight.class)) {
-                return true;
+                unCheckLogin = true;
             }
             if (method.getDeclaringClass().isAnnotationPresent(VciUnCheckRight.class)) {
-                return true;
+                unCheckLogin = true;
             }
         }
         if(url.endsWith(".md")){
+            unCheckLogin = true;
+        }
+        if(unCheckLogin){
+            //铏界劧涓嶆牎楠屾潈闄愶紝浣嗘槸濡傛灉token涓嶄负绌猴紝闇�瑕佹洿鏂板綋鍓嶇敤鎴�
+            SessionInfo sessionInfo = getSessionInfo(userToken);
+
             return true;
+        }
+        //鑾峰彇閰嶇疆鏂囦欢涓紝涓嶆牎楠屾潈闄愮殑璺緞
+        List<String> unCheckUrls = new ArrayList<>();
+        if(springMVCConfig !=null && springMVCConfig.getUnCheckUrls() !=null){
+            unCheckUrls = springMVCConfig.getUnCheckUrls();
         }
         if(StringUtils.isBlank(userToken) && !unCheckUrls.contains(url)){
             //璇存槑鏄病鏈夌敤鎴蜂俊鎭殑锛岃�屼笖涔熷繀椤昏鏍¢獙鏄惁鐧诲綍鐨勬儏鍐�
@@ -111,14 +107,15 @@
             }
             sendErrorMsg(response,"娌℃湁鐧诲綍绯荤粺锛岃鍏堢櫥褰�",1);
             return false;
-            //琚玊涓嬬嚎鐢眞ebsocket鐩存帴鎻愰啋
+            //琚涪涓嬬嚎鐢眞ebsocket鐩存帴鎻愰啋
         }else{
+            SessionInfo sessionInfo = getSessionInfo(userToken);
             if(sessionInfo == null){
-                //涔熸槸璇存槑涓嶅瓨鍦紝琚玊涓嬬嚎鏃朵篃鑾峰彇涓嶅埌session鐨勪俊鎭簡
+                //涔熸槸璇存槑涓嶅瓨鍦紝琚涪涓嬬嚎鏃朵篃鑾峰彇涓嶅埌session鐨勪俊鎭簡
                 if(logger.isErrorEnabled()) {
-                    logger.error("token鍊奸潪娉曪紝鎴栬�呯敤鎴峰凡缁忚韪笅绾�," + userToken);
+                    logger.error("token鍊奸潪娉曪紝鎴栬繃鏈燂紝鎴栬�呯敤鎴峰凡缁忚韪笅绾�," + userToken);
                 }
-                sendErrorMsg(response,"token鍊奸潪娉曪紝鎴栬�呯敤鎴峰凡缁忚韪笅绾�," + userToken,1);
+                sendErrorMsg(response,"token鍊奸潪娉曪紝鎴栬繃鏈燂紝鎴栬�呯敤鎴峰凡缁忚韪笅绾�," + userToken,1);
                 return false;
             }else{
                 if(!unCheckUrls.contains(url)){
@@ -155,6 +152,22 @@
         return true;
     }
 
+    private SessionInfo getSessionInfo(String userToken){
+        SessionInfo sessionInfo = null;
+        if(StringUtils.isNotBlank(userToken)){
+            try{
+                sessionInfo = sessionForLoginI.getSessionInfoByToken(userToken);
+            }catch (Throwable e){
+                logger.error("鑾峰彇token鍑洪敊",e);
+            }
+            if(sessionInfo!=null){
+                WebThreadLocalUtil.setCurrentUserSessionInfoInThread(sessionInfo);
+                WebThreadLocalUtil.setTokenInThread(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS+sessionInfo.getToken());
+            }
+        }
+        return sessionInfo;
+    }
+
     /**
      * 杩斿洖閿欒淇℃伅
      * @param response 鐩稿簲瀵硅薄
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSessionForLoginI.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSessionForLoginI.java
index ad50dfc..96d9b5f 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSessionForLoginI.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSessionForLoginI.java
@@ -2,6 +2,7 @@
 
 import com.vci.starter.web.exception.VciBaseException;
 import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.pagemodel.TokenVO;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -68,4 +69,32 @@
      * @return 鐢ㄦ埛鍦ㄧ郴缁熶腑杩樺彲浠ュ瓨鍦ㄧ殑鏃堕棿(姣)
      */
     long getCanAliveTime(String userToken);
+
+    /**
+     * 鍒涘缓璁稿彲鐨勪俊鎭紝骞跺瓨鍌ㄥ埌缂撳瓨涓�
+     * @param sessionInfo session鐨勪俊鎭�
+     * @return 璁稿彲淇℃伅
+     */
+    TokenVO createToken(SessionInfo sessionInfo) ;
+
+    /**
+     * 鍒涘缓璁稿彲鐨勪俊鎭紝骞跺瓨鍌ㄥ埌缂撳瓨涓�
+     * @param key token鍦╮edis涓殑key銆�
+     * @param sessionInfo session鐨勪俊鎭�
+     * @return 璁稿彲淇℃伅
+     */
+    TokenVO createToken(String key, SessionInfo sessionInfo) ;
+
+    /**
+     * 鍒锋柊缂撳瓨涓殑token
+     * @param sessionInfo session鐨勪俊鎭�
+     */
+    void refreshToken(SessionInfo sessionInfo);
+
+    /**
+     * 鍒锋柊缂撳瓨涓殑token
+     * @param key token鍦╮edis涓殑key
+     * @param sessionInfo session鐨勪俊鎭�
+     */
+    void refreshToken(String key, SessionInfo sessionInfo);
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/SessionInfo.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/SessionInfo.java
index 9147094..37c2102 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/SessionInfo.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/SessionInfo.java
@@ -1,10 +1,7 @@
 package com.vci.starter.web.pagemodel;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * session淇℃伅妯″瀷
@@ -236,6 +233,11 @@
 	 * 瀵嗙爜淇℃伅
 	 */
 	private String passwordInfo;
+
+	/**
+	 * 鏈�鍚庣櫥褰曟椂闂�
+	 */
+	private long lastLoginTime;
 
 	public String getDutyOid() {
 		return dutyOid;
@@ -614,6 +616,14 @@
 		this.functionOperaMap = functionOperaMap;
 	}
 
+	public long getLastLoginTime() {
+		return lastLoginTime;
+	}
+
+	public void setLastLoginTime(long lastLoginTime) {
+		this.lastLoginTime = lastLoginTime;
+	}
+
 	@Override
 	public String toString() {
 		return "SessionInfo{" +
@@ -664,6 +674,7 @@
 				", workNo='" + workNo + '\'' +
 				", isMustChangePassword=" + isMustChangePassword +
 				", passwordInfo='" + passwordInfo + '\'' +
+				", lastLoginTime=" + lastLoginTime +
 				'}';
 	}
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/ControllerUtil.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/ControllerUtil.java
index 876a80b..7c9b4d6 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/ControllerUtil.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/ControllerUtil.java
@@ -1,19 +1,17 @@
 package com.vci.starter.web.util;
 
-import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.constant.VConstant;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.http.MediaType;
 
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.net.URLDecoder;
 import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -292,7 +290,7 @@
      * @param isQueryTotal 鏄惁鏌ヨ鎬绘暟
      */
     public static void setQueryTotal(HttpServletRequest request, boolean isQueryTotal){
-        WebThreadLocalUtil.getNeedQueryTotalInThread().set(isQueryTotal?"true":"false");
+        WebThreadLocalUtil.setNeedQueryTotalInThread(isQueryTotal?"true":"false");
         //request.setAttribute(webProperties.getQueryTotalSessionName(), isQueryTotal);
     }
 
@@ -323,4 +321,32 @@
             tempFileForDownloadMap.remove(uuid);
         }
     }
+
+    /**
+     * 鍐呭缂栫爜
+     *
+     * @param str 鍐呭
+     * @return 缂栫爜鍚庣殑鍐呭
+     */
+    public static String urlEncode(String str) {
+        try {
+            return URLEncoder.encode(str, VConstant.UTF8);
+        } catch (UnsupportedEncodingException e) {
+            return StringUtils.EMPTY;
+        }
+    }
+
+    /**
+     * 鍐呭瑙g爜
+     *
+     * @param str 鍐呭
+     * @return 瑙g爜鍚庣殑鍐呭
+     */
+    public static String urlDecode(String str) {
+        try {
+            return URLDecoder.decode(str, VConstant.UTF8);
+        } catch (UnsupportedEncodingException e) {
+            return StringUtils.EMPTY;
+        }
+    }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
index 913d390..1af32e7 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
@@ -1210,7 +1210,7 @@
      * @return 浼氳瘽瀵硅薄
      */
     public static SessionInfo getCurrentUserSessionInfoNotException() {
-        return WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+        return WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
     }
 
     /**
@@ -1218,7 +1218,7 @@
      * @param sessionInfo 鐢ㄦ埛瀵硅薄
      */
     public static void setCurrentUserSessionInfo(SessionInfo sessionInfo){
-        WebThreadLocalUtil.getCurrentUserSessionInfoInThread().set(sessionInfo);
+        WebThreadLocalUtil.setCurrentUserSessionInfoInThread(sessionInfo);
     }
 
     /**
@@ -1226,7 +1226,7 @@
      * @return true琛ㄧず鏌ヨ
      */
     public static boolean isQueryTotal(){
-        String needQueryTotal = WebThreadLocalUtil.getNeedQueryTotalInThread().get();
+        String needQueryTotal = WebThreadLocalUtil.getNeedQueryTotalInThread();
         if("false".equalsIgnoreCase(needQueryTotal)){
             return false;
         }else{
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciDateUtil.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciDateUtil.java
index 14acc5d..9fc6ce2 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciDateUtil.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciDateUtil.java
@@ -1075,6 +1075,15 @@
 	}
 
 	/**
+	 * 鑾峰彇褰撳墠鏃堕棿鐨則ime鍊�
+	 * @Return java.lang.Long
+	 */
+	public static Long getNowTime() {
+		Date date = new Date();
+		return date.getTime();
+	}
+
+	/**
 	 * 灏唗imestamp杞崲涓篋ate
 	 * @param timestamp timestamp
 	 * @Return java.util.Date
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/WebThreadLocalUtil.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/WebThreadLocalUtil.java
index bf5b699..a5303dd 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/WebThreadLocalUtil.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/WebThreadLocalUtil.java
@@ -1,6 +1,7 @@
 package com.vci.starter.web.util;
 
 
+import com.alibaba.ttl.TransmittableThreadLocal;
 import com.vci.starter.web.pagemodel.SessionInfo;
 
 /**
@@ -12,33 +13,43 @@
     /**
      * 绾跨▼閲岀殑褰撳墠鐢ㄦ埛session淇℃伅
      */
-    private static ThreadLocal<SessionInfo> currentUserSessionInfoInThread = new ThreadLocal<SessionInfo>();
+    private static TransmittableThreadLocal<SessionInfo> currentUserSessionInfoInThread = new TransmittableThreadLocal<SessionInfo>();
 
     /**
      * 鏌ヨ鍒楄〃鐨勬椂鍊欐槸鍚︽煡璇㈡�绘暟
      */
-    private static ThreadLocal<String> needQueryTotalInThread = new ThreadLocal<String>();
+    private static TransmittableThreadLocal<String> needQueryTotalInThread = new TransmittableThreadLocal<String>();
 
+    /**
+     * 绾跨▼閲岀殑褰撳墠token淇℃伅
+     */
+    private static TransmittableThreadLocal<String> tokenThread = new TransmittableThreadLocal<String>();
 
     /**
      * 鑾峰彇褰撳墠鐢ㄦ埛鐨剆ession瀵硅薄
      * @return session瀵硅薄
      */
-    public static ThreadLocal<SessionInfo> getCurrentUserSessionInfoInThread() {
-        return currentUserSessionInfoInThread;
+    public static SessionInfo getCurrentUserSessionInfoInThread() {
+        return currentUserSessionInfoInThread.get();
     }
 
-
-    public static void setCurrentUserSessionInfoInThread(ThreadLocal<SessionInfo> currentUserSessionInfoInThread) {
-        WebThreadLocalUtil.currentUserSessionInfoInThread = currentUserSessionInfoInThread;
+    public static void setCurrentUserSessionInfoInThread(SessionInfo sessionInfo) {
+        currentUserSessionInfoInThread.set(sessionInfo);
     }
 
-    public static ThreadLocal<String> getNeedQueryTotalInThread() {
-        return needQueryTotalInThread;
+    public static String getNeedQueryTotalInThread() {
+        return needQueryTotalInThread.get();
     }
 
-    public static void setNeedQueryTotalInThread(ThreadLocal<String> needQueryTotalInThread) {
-        WebThreadLocalUtil.needQueryTotalInThread = needQueryTotalInThread;
+    public static void setNeedQueryTotalInThread(String needQueryTotal) {
+        needQueryTotalInThread.set(needQueryTotal);
     }
 
+    public static String getTokenInThread() {
+        return tokenThread.get();
+    }
+
+    public static void setTokenInThread(String token) {
+        tokenThread.set(token);
+    }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java
index 20a4a98..126723c 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java
@@ -3,14 +3,20 @@
 import com.vci.corba.common.PLException;
 import com.vci.corba.omd.data.AttributeValue;
 import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.constant.TokenKeyConstant;
 import com.vci.starter.web.exception.VciBaseException;
 import com.vci.starter.web.interceptor.VciSessionForLoginI;
 import com.vci.starter.web.pagemodel.SessionInfo;
-import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.pagemodel.TokenVO;
+import com.vci.starter.web.util.*;
+import com.vci.web.constant.CacheNameConstant;
 import com.vci.web.properties.WebProperties;
+import com.vci.web.redis.RedisService;
 import com.vci.web.service.WebBoServiceI;
 import com.vci.web.util.PlatformClientUtil;
 import com.vci.web.util.WebUtil;
+import io.jsonwebtoken.Claims;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,11 +24,13 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 浼氳瘽瀛樺偍鐨勬湇鍔�
@@ -55,6 +63,12 @@
      */
     @Autowired
     private PlatformClientUtil platformClientUtil;
+
+    /**
+     * redis鏈嶅姟
+     */
+    @Resource
+    private RedisService redisService;
 
     /**
      * 妫�鏌ョ敤鎴锋槸鍚︾櫥褰�
@@ -137,11 +151,14 @@
     @Override
     public void updateRequestTime(String userToken) {
         WebUtil.alertNotNull(userToken,"浼氳瘽璁稿彲鐮�");
-        try{
-            platformClientUtil.getBOFactoryService().executeUpdateSql("update VCI_SESSIONINFO set lastRequestTime = " + String.valueOf(System.currentTimeMillis()) + " where TOKEN ='" + userToken.trim() + "'");
-        }catch (PLException e){
-            throw WebUtil.getVciBaseException(e);
+        //璇存槑鏄痡wt鐨則oken
+        String jwtToken = getSessionTokenKeyInRedis(userToken);
+        if(StringUtils.isBlank(jwtToken)){
+            jwtToken = userToken;
         }
+        SessionInfo sessionInfo = redisService.getCacheObject(jwtToken);
+        sessionInfo.setLastLoginTime(VciDateUtil.getNowTime());
+        redisService.setCacheObject(jwtToken, sessionInfo, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES);
     }
 
     /**
@@ -153,16 +170,26 @@
     @Override
     public SessionInfo getSessionInfoByToken(String userToken) {
         WebUtil.alertNotNull(userToken,"璁稿彲鐨勪俊鎭�");
-        List<Map> dataList = boService.queryBySqlForMap("select JSONSTRING as JSONSTRING from VCI_SESSIONINFO where TOKEN ='" + userToken.trim() + "'", new HashMap<>());
-//        List<Map> dataList = null;
-//        Map map= new HashMap<>();
-//        map.put("JSONSTRING","{\"browser\":\"122.0.0.0\",\"deptName\":\"涓�杞﹂棿\",\"deptOid\":\"002151D0-13B9-DB23-7006-34DCAC76B3BE\",\"deviceInfo\":[],\"email\":\"\",\"functionOids\":[\"2339F262-1715-F5EE-7E50-4DD6A42B8668\",\"2EC65569-17C7-84C2-A7A6-737E1B021DC4\",\"32037B20-2F95-F4E8-6077-C0B5226B033D\",\"ADB513D3-397E-07DA-7456-992916FF12D9\",\"5D2FDBCA-E04D-B611-8311-8F06E031BF95\",\"56186AEE-80D7-2CDB-CB80-09E87CB9125F\",\"536FD86E-779E-397D-2945-69AAA942A578\",\"FDB26577-596F-CA6F-1A1F-7D68C0E0A3B9\",\"E612DAB4-B3EC-8D08-46CA-8905AC82EF2D\",\"893E5778-481C-A04E-2742-ADFDF0CE3A15\",\"297C9ED8-DF76-9D91-B041-45F1DE161FD8\",\"63A98B92-5DA8-3F23-390E-2A389C714BC1\",\"931C3199-3CA8-733B-1CF3-FE88F0258E16\",\"AC04E222-F14B-F4FF-11BB-DFE8917A2756\",\"64C6BFFD-95B2-995A-73FD-DEE8212DAA56\",\"CC5F364D-E299-81CF-0B20-4BF09956FDA3\",\"B5985BFB-F31D-05A1-9943-D43704F35EDB\",\"86BD9541-8F9B-395F-A73D-B856635EE91C\",\"72ACFF87-05B6-3D8F-4CC4-C559FE9AD372\",\"ECFA5263-AB30-78CB-6F5B-DF11BC054616\",\"88AC00BE-54CC-DE68-F31E-C3D9FAEDD902\",\"F2B19983-15EF-4DC8-0A26-AF322EC8B9D0\",\"D8C8AE63-AD0B-D567-BFBE-AE4BF302C241\",\"D0715569-0F88-5CAB-E9DB-2B93567FC610\",\"2C5FABD2-535F-8568-8E61-C643BA7D77A1\",\"E6E963E7-2DF6-80EE-2A61-FA86E0F3D5F2\",\"BDBD6CFA-2F4C-EEF7-C380-5E9BBF6A37B3\",\"7FE9306A-2659-4E62-1C2B-A09A600A1010\",\"B3EC1413-1A33-61E3-DDD1-CB4D0CFD0C6E\",\"23B65414-A7F9-21B4-A5A9-4F963B8C4ED9\",\"E1A8FA2E-6102-F4C6-209F-C589CD2149F2\",\"077A25D8-09D8-D5DE-42BC-A777BE3327D5\",\"0C8E0C13-A0C1-A4FC-F957-F595DA54E355\",\"BFB9E279-DD28-7172-4A52-2A1767AD7663\",\"CEEAE20E-D93E-2D04-13C6-B8BD5B336374\",\"E84E06C3-60AE-42B8-88BD-1BE52531C1FF\",\"CB5C52F0-5D84-0738-0DA6-0721B76AADB8\",\"C755CC24-7194-BAC4-A3C2-D79E1E3CC594\",\"D8084EB8-AAB0-75A8-7BDD-3DC075D1D919\",\"6C538322-CCFC-ABA2-3BC6-7048C9711ADF\",\"5CEEDD16-4467-2798-245F-57E63CFD7753\",\"A4853E63-0044-52F2-5420-E34B28387C9C\",\"8239D998-F8DF-10B0-24CF-4525FE03E760\",\"D0FCC667-4182-8F03-801E-22E11553B39E\",\"3CB2A1CD-83CA-C155-2675-7B7681E7B03F\",\"C15B77F2-7F7F-2385-BD1F-8A241FF7C1A3\",\"B98ABE87-00DA-4BCA-A3B3-3EB7DF9BE8D9\",\"D25A0998-D315-97F8-36DB-6951E981E54C\",\"2841A478-8E99-7A89-4879-309DFFE5DD61\",\"25C58C8A-D28B-DA99-97A3-F6544B4B8E8D\",\"2AA1BD3D-9318-431F-AB55-ECF4318BDC9F\",\"AC4084E2-06E3-FDD6-7F50-8C1E8090358C\",\"4B919471-E62F-F717-6AC8-DE2B10A2A1DC\",\"D38C457D-FC45-C068-5322-457E522651DC\",\"2DCB5CF2-8127-3826-CCAE-1C40C6746EE8\",\"21766DD3-0B62-C577-FB84-940C1B84711C\",\"ABF503E5-9741-C2BE-31B0-6E15AB50E2D6\",\"B203DE0A-EDD0-4295-1257-79A76917BE85\",\"65A88CCC-220E-3CBF-0D31-E0DF5BDD9C6F\",\"8B7DBACB-C18A-CA11-B0B8-3C481E76E30F\",\"45FB1520-F571-9E97-2EA3-B9C78AF89BEC\",\"E34E1E0D-55F8-3C19-8E7B-E42D8A3FEEB9\"],\"globalAttributeMap\":{},\"ip\":\"127.0.0.1\",\"mustChangePassword\":false,\"os\":\"Windows 10\",\"portalId\":\"1\",\"rolesName\":{\"44044800-B0EB-1003-55B5-954C3FFEA3B8\":\"EBOM瀵煎叆浜哄憳\",\"38FC5CC2-D880-A1C5-5DA0-C2F8B5082B52\":\"鏍″\",\"BA272199-5FF5-C513-F4FA-37F13A733FE8\":\"宸ヨ壓浜哄憳\",\"2761C8F4-6442-A53C-9F40-A1D5978E0799\":\"瀹℃牳\",\"DCF4961B-44DE-BA5B-F73C-8AA1EF1F1DB4\":\"gy1\",\"DA2608CC-07CB-A3FF-528B-CBE040BD7353\":\"缂栧埗\",\"A70A10D5-ED69-0CF5-8491-33D955569550\":\"浼氱\",\"CE4A351B-3669-9722-01AC-2E472B2900A5\":\"涓�鑸敤鎴穃",\"F5E11DDB-88E5-40F8-61B9-3F9E9ADAFFBF\":\"宸ヨ壓缁勯暱\",\"2DFA4811-B391-6727-33C6-697BF4E9A77D\":\"鎵瑰噯\",\"785F8459-DDEA-33D1-40D5-C3F6A42FABB1\":\"涓绘暟鎹甛",\"398B28CE-B1EE-FDEA-5B11-42908B8A3076\":\"PBOM绠$悊宀椾汉鍛榎"},\"sso\":false,\"token\":\"8b9f42164c6b7fd3ca532acf375626cd\",\"userId\":\"1\",\"userName\":\"娴嬭瘯\",\"userOid\":\"921D71F8-C2BB-3BCE-B744-AD0C3812F41A\",\"userSecret\":\"2\",\"usertype\":\"2\"}");
-        if(!CollectionUtils.isEmpty(dataList)) {
-            Map data = dataList.get(0);
-            SessionInfo sessionInfo = WebUtil.jsonString2JavaBean((String)data.getOrDefault("JSONSTRING",""),SessionInfo.class);
-            return  sessionInfo;
+        SessionInfo sessionInfo = null;
+        if(StringUtils.isNotBlank(userToken)){
+            if(userToken.startsWith(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS)){
+                sessionInfo = redisService.getCacheObject(userToken);
+                if(sessionInfo == null){
+                    throw new VciBaseException("token宸茶繃鏈燂紒");
+                }
+            }else{
+                //璇存槑鏄痡wt鐨則oken
+                String jwtToken = getSessionTokenKeyInRedis(userToken);
+                if(StringUtils.isBlank(jwtToken)){
+                    jwtToken = userToken;
+                }
+                sessionInfo = redisService.getCacheObject(jwtToken);
+                if(sessionInfo == null){
+                    throw new VciBaseException("token宸茶繃鏈燂紒");
+                }
+            }
         }
-        return null;
+        return sessionInfo;
     }
 
     /**
@@ -231,4 +258,88 @@
             }
         }
     }
+
+    /**
+     * 鍒涘缓璁稿彲鐨勪俊鎭紝骞跺瓨鍌ㄥ埌缂撳瓨涓�
+     *
+     * @param sessionInfo session鐨勪俊鎭�
+     * @return 璁稿彲淇℃伅
+     */
+    @Override
+    public TokenVO createToken(SessionInfo sessionInfo) {
+        return createToken(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS, sessionInfo);
+    }
+
+    /**
+     * 鍒涘缓璁稿彲鐨勪俊鎭紝骞跺瓨鍌ㄥ埌缂撳瓨涓�
+     * @param key token鍦╮edis涓殑key
+     * @param sessionInfo session鐨勪俊鎭�
+     * @return 璁稿彲淇℃伅
+     */
+    @Override
+    public TokenVO createToken(String key, SessionInfo sessionInfo) {
+        if(StringUtils.isBlank(sessionInfo.getToken())) {
+            String token = Md5.md5(VciBaseUtil.getPk() + "_" + sessionInfo.getUserId());
+            sessionInfo.setToken(token);
+        }
+        if(StringUtils.isBlank(key)){
+            key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS;
+        }
+        refreshToken(key, sessionInfo);
+        Map<String,Object> claimsMap = new HashMap<>();
+        claimsMap.put(TokenKeyConstant.JWT_TOKEN_KEY,sessionInfo.getToken());
+        claimsMap.put(TokenKeyConstant.JWT_USER_KEY,sessionInfo.getUserOid());
+        claimsMap.put(TokenKeyConstant.JWT_USER_NAME_KEY,sessionInfo.getUserName());
+        claimsMap.put(TokenKeyConstant.JWT_USER_CODE_KEY,sessionInfo.getUserId());
+        TokenVO tokenVO = new TokenVO();
+        tokenVO.setAccessToken(JwtUtils.createToken(claimsMap));
+        tokenVO.setExpireTime(TokenKeyConstant.EXPIRATION);
+        return tokenVO;
+    }
+
+    /**
+     * 鍒锋柊缂撳瓨涓殑token
+     * @param sessionInfo session鐨勪俊鎭�
+     */
+    @Override
+    public void refreshToken(SessionInfo sessionInfo) {
+        refreshToken(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS, sessionInfo);
+    }
+
+    /**
+     * 鍒锋柊缂撳瓨涓殑token
+     * @param key token鍦╮edis涓殑key
+     * @param sessionInfo session鐨勪俊鎭�
+     */
+    @Override
+    public void refreshToken(String key, SessionInfo sessionInfo) {
+        if(sessionInfo!=null && StringUtils.isNotBlank(sessionInfo.getToken())){
+            if(StringUtils.isBlank(key)){
+                key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS;
+            }
+            String redisKey = key + sessionInfo.getToken();
+            redisService.setCacheObject(redisKey, sessionInfo, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES);
+
+            //鍥犱负鍙兘闇�瑕侀��鍑虹櫥褰曪紝鎴栧悓涓�鐢ㄦ埛鍙兘鍦ㄧ嚎涓�涓紝鏁呴渶瑕佸瓨鍌紝鐢ㄦ埛鍜宩wtToken鐨勫叧绯�
+            String tokenKey = CacheNameConstant.cacheKey(CacheNameConstant.USERID_TOKEN_KEY,sessionInfo.getUserId());
+            redisService.setCacheObject(tokenKey, redisKey, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES);
+        }
+    }
+
+    /**
+     * jwt鐨則oken鏀规垚
+     * @param jwtToken jwt鐨勮鍙�
+     * @return 鍦╮edis閲岀殑淇℃伅
+     */
+    private String getSessionTokenKeyInRedis(String jwtToken) {
+        if(StringUtils.isBlank(jwtToken)){
+            return "";
+        }
+        String key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS;
+        if(ControllerUtil.urlDecode(jwtToken).startsWith(key)){
+            return ControllerUtil.urlDecode(jwtToken);
+        }
+        String userToken = JwtUtils.getUserToken(jwtToken);
+        return TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS + userToken;
+    }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java
index e241856..79655e4 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java
@@ -146,11 +146,6 @@
      */
     private String photo;
 
-    /**
-     * token鍊�
-     */
-    private String token;
-
     @Override
     public String getId() {
         return id;
@@ -362,14 +357,6 @@
         this.photo = photo;
     }
 
-    public String getToken() {
-        return token;
-    }
-
-    public void setToken(String token) {
-        this.token = token;
-    }
-
     @Override
     public String toString() {
         return "SmUserVO{" +
@@ -399,7 +386,6 @@
                 ", langCodeText='" + langCodeText + '\'' +
                 ", lockFlag=" + lockFlag +
                 ", photo='" + photo + '\'' +
-                ", token='" + token + '\'' +
                 '}';
     }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/bo/LoginResultBO.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/bo/LoginResultBO.java
index 08973cb..7898b38 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/bo/LoginResultBO.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/bo/LoginResultBO.java
@@ -1,6 +1,7 @@
 package com.vci.web.bo;
 
 import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.pagemodel.TokenVO;
 
 import java.util.Arrays;
 import java.util.Map;
@@ -47,14 +48,14 @@
     private String passwordInfo;
 
     /**
-     * 浼氳瘽淇℃伅
-     */
-    private SessionInfo sessionInfo;
-
-    /**
      * 璇锋眰鐨勭浉鍏崇殑鍙傛暟
      */
     private Map<String,String[]> requestParams;
+
+    /**
+     * 浠ょ墝淇℃伅
+     */
+    private TokenVO tokenVO;
 
     public boolean isSuccess() {
         return success;
@@ -104,20 +105,20 @@
         this.passwordInfo = passwordInfo;
     }
 
-    public SessionInfo getSessionInfo() {
-        return sessionInfo;
-    }
-
-    public void setSessionInfo(SessionInfo sessionInfo) {
-        this.sessionInfo = sessionInfo;
-    }
-
     public Map<String, String[]> getRequestParams() {
         return requestParams;
     }
 
     public void setRequestParams(Map<String, String[]> requestParams) {
         this.requestParams = requestParams;
+    }
+
+    public TokenVO getTokenVO() {
+        return tokenVO;
+    }
+
+    public void setTokenVO(TokenVO tokenVO) {
+        this.tokenVO = tokenVO;
     }
 
     @Override
@@ -129,8 +130,8 @@
                 ", failMsgArray=" + Arrays.toString(failMsgArray) +
                 ", mustChangePassword=" + mustChangePassword +
                 ", passwordInfo='" + passwordInfo + '\'' +
-                ", sessionInfo=" + sessionInfo +
                 ", requestParams=" + requestParams +
+                ", tokenVO=" + tokenVO +
                 '}';
     }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/CacheNameConstant.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/CacheNameConstant.java
index 3b3072c..29676cc 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/CacheNameConstant.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/CacheNameConstant.java
@@ -109,6 +109,11 @@
     public static final String VCI_USER_LOGIN = "vci_user_login:";
 
     /**
+     * 鐢ㄦ埛ID鍜宼oken鍏崇郴鐨刱ey
+     */
+    public static final String USERID_TOKEN_KEY = "userid_token_key:";
+
+    /**
      * 杩斿洖鎷兼帴鍚庣殑key
      *
      * @param cacheKey      缂撳瓨key
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java
deleted file mode 100644
index 6f7bd08..0000000
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.vci.web.constant;
-
-/**
- * token鐨勭浉鍏砶ey
- * @author weidy
- * @date 2019/11/7 10:10 AM
- */
-public class TokenKeyConstant {
-
-    /**
-     * 鐢ㄦ埛鐨則oken浼犺緭鏃朵娇鐢ㄧ殑鍚嶇О
-     */
-    public static final String USER_TOKEN_KEY ="AuthorizationToken";
-
-    /**
-     * 绯荤粺鐨則oken浼犺緭鏃朵娇鐢ㄧ殑鍚嶇О
-     */
-    public static final String SYSTEM_PRIVATE_KEY = "AuthorizationSystemToken";
-
-    /**
-     * 绯荤粺鐨勬棩蹇楅摼璺富閿紶杈撴椂浣跨敤鐨勫悕绉�
-     */
-    public static final String LOG_TRACE_ID_KEY = "AuthorizationLogTraceId";
-
-    /**
-     * 鏃ュ織鐨勮拷韪富閿殑鍚嶇О
-     */
-    public static final String TRACE_ID = "logTraceId";
-
-    /**
-     * 绯荤粺鐨勫璇弬鏁板悕绉�
-     */
-    public static final String LANGUAGE_KEY = "vciLanguageCode";
-
-    /**
-     * 璇锋眰鐨勬椂闂村弬鏁�
-     */
-    public static final String REQUEST_TIMESTAMP = "vciHttpStartRequestTime";
-
-}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LoginController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LoginController.java
index 87d292d..8f8310a 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LoginController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LoginController.java
@@ -133,7 +133,7 @@
 					if(!loginResultBO.isSuccess()){
 						msg = loginResultBO.getFailMsg();
 					}else {
-						token = loginResultBO.getSessionInfo().getToken();
+						token = loginResultBO.getTokenVO().getAccessToken();
 					}
 				}catch (Throwable e){
 					msg = LangBaseUtil.getErrorMsg(e);
@@ -196,7 +196,7 @@
 						msg = loginResultBO.getFailMsg();
 						return BaseResult.fail(msg);
 					}else {
-						token = loginResultBO.getSessionInfo().getToken();
+						token = loginResultBO.getTokenVO().getAccessToken();
 						msg="鐧诲綍鎴愬姛锛�";
 					}
 				}catch (Throwable e){
@@ -297,7 +297,7 @@
 	@ResponseBody
 	public BaseResult getSessionInfo(){
 		BaseResult<SessionInfo> json = new BaseResult<>();
-		json.setObj(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get());
+		json.setObj(WebThreadLocalUtil.getCurrentUserSessionInfoInThread());
 		if(json.getObj()!=null){
 			json.setSuccess(true);
 		}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/LoginServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/LoginServiceI.java
index 5b63e6c..deb8d8a 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/LoginServiceI.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/LoginServiceI.java
@@ -38,32 +38,4 @@
      * @throws VciBaseException 鍒犻櫎浼氳瘽淇℃伅鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
      */
     void logout(String userToken) throws VciBaseException;
-
-    /**
-     * 鍒锋柊token
-     * @param sessionInfo session鐨勪俊鎭�
-     */
-    void refreshToken(SessionInfo sessionInfo);
-
-    /**
-     * 鍒锋柊token
-     * @param key token鍦╮edis涓殑key
-     * @param sessionInfo session鐨勪俊鎭�
-     */
-    void refreshToken(String key, SessionInfo sessionInfo);
-
-    /**
-     * 鍒涘缓璁稿彲鐨勪俊鎭�
-     * @param sessionInfo session鐨勪俊鎭�
-     * @return 璁稿彲淇℃伅
-     */
-    TokenVO createToken(SessionInfo sessionInfo) ;
-
-    /**
-     * 鍒涘缓璁稿彲鐨勪俊鎭�
-     * @param key token鍦╮edis涓殑key銆�
-     * @param sessionInfo session鐨勪俊鎭�
-     * @return 璁稿彲淇℃伅
-     */
-    TokenVO createToken(String key, SessionInfo sessionInfo) ;
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java
index 17aa5b1..5d8706a 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java
@@ -19,10 +19,7 @@
 import com.vci.starter.web.pagemodel.RequestClientInfo;
 import com.vci.starter.web.pagemodel.SessionInfo;
 import com.vci.starter.web.pagemodel.TokenVO;
-import com.vci.starter.web.util.ApplicationContextProvider;
-import com.vci.starter.web.util.JwtUtils;
-import com.vci.starter.web.util.Md5;
-import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.*;
 import com.vci.web.bo.LoginResultBO;
 import com.vci.web.constant.CacheNameConstant;
 import com.vci.web.dto.LoginUserDTO;
@@ -142,15 +139,17 @@
         }
 
         //闇�瑕佺湅鐪嬫槸鍚﹀凡缁忕櫥褰曚簡
-        String loginKey = CacheNameConstant.cacheKey(CacheNameConstant.VCI_USER_LOGIN, userDTO.getUserId());
-        if(redisService.hasKey(loginKey) && !userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()){
+        String userIdTokenKey = CacheNameConstant.cacheKey(CacheNameConstant.USERID_TOKEN_KEY, userDTO.getUserId().trim());
+        if(redisService.hasKey(userIdTokenKey) && !userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()){
             loginResult.setFailCode(USER_IS_LOGINED);
             loginResult.setFailMsg("褰撳墠鐢ㄦ埛宸茬粡鍦ㄥ叾浠栧湴鏂圭櫥褰曪紒");
             return loginResult;
         }
         //璇存槑宸茬粡鐧诲綍浜嗭紝閭e簲璇ュ彇娑堝師鏉ョ殑鐧诲綍
-        if (redisService.hasKey(loginKey) && userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()) {
-            redisService.deleteObject(CacheNameConstant.VCI_USER_LOGIN);
+        if (redisService.hasKey(userIdTokenKey) && userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()) {
+            String tokenKey = redisService.getCacheObject(userIdTokenKey);
+            redisService.deleteObject(tokenKey);
+            redisService.deleteObject(userIdTokenKey);
         }
 
         //2.鑾峰彇鐢ㄦ埛鐨勫璞�.
@@ -308,10 +307,10 @@
 
         loginResult.setSuccess(true);
         sessionInfo.setToken(Md5.md5(VciBaseUtil.getPk() + "_" + user.getId()));
-        loginResult.setSessionInfo(sessionInfo);
 
         //娣诲姞鍒颁細璇濅俊鎭�
-        saveSessionInfo(sessionInfo);
+        TokenVO tokenVO = saveSessionInfo(sessionInfo);
+        loginResult.setTokenVO(tokenVO);
 
         return loginResult;
     }
@@ -322,14 +321,7 @@
      * @Return com.vci.frameworkcore.pagemodel.SmUserVO
      */
     private SmUserVO getUserByUserId(String userId) {
-        String userKey = CacheNameConstant.cacheKey(CacheNameConstant.VCI_USER,userId);
-        String userOid = redisService.getCacheObject(userKey);
-        String oidKey = CacheNameConstant.cacheKey(CacheNameConstant.VCI_USER_OID, userOid);
-        SmUserVO userVO = redisService.getCacheObject(oidKey);
-        if(userVO == null || StringUtils.isBlank(userVO.getOid())){
-            userVO = userQueryService.getUserByUserId(userId);
-        }
-        return userVO;
+        return userQueryService.getUserByUserId(userId);
     }
 
 
@@ -403,16 +395,11 @@
      * 淇濆瓨浼氳瘽淇℃伅
      * @param sessionInfo 浼氳瘽淇℃伅
      */
-    private void saveSessionInfo(SessionInfo sessionInfo){
+    private TokenVO saveSessionInfo(SessionInfo sessionInfo){
         if(sessionForLogin == null){
             throw new VciBaseException("娌℃湁閰嶇疆浼氳瘽瀛樺偍鐨勬湇鍔�");
         }
-        //灏嗘潈闄愪俊鎭紝鏀惧叆redis缂撳瓨涓�備互闃叉session涓殑淇℃伅杩囧锛屽瓨鍏ユ暟鎹簱涓嚭鐜伴敊璇�
-        redisService.setCacheList(sessionInfo.getToken(),sessionInfo.getFunctionOids());
-        redisService.expire(sessionInfo.getToken(), 1, TimeUnit.HOURS);
-
-        sessionInfo.setFunctionOids(new ArrayList<>());
-        sessionForLogin.saveSessionInfo(sessionInfo);
+        return sessionForLogin.createToken(sessionInfo);
     }
 
     /**
@@ -462,6 +449,7 @@
         sessionInfo.setRtxNo(user.getRtxNo());
         sessionInfo.setIMId(user.getIMNo());
         sessionInfo.setPortalId(user.getId());
+        sessionInfo.setLastLoginTime(user.getLastLoginTime()!=null?user.getLastLoginTime().getTime(): VciDateUtil.getNowTime());
     }
 
     /**
@@ -494,69 +482,6 @@
      */
     private void updateUserForLoginSuccess(String userOid){
         userQueryService.updateUserLoginTime(userOid);
-    }
-
-    /**
-     * 鍒涘缓璁稿彲鐨勪俊鎭�
-     *
-     * @param sessionInfo session鐨勪俊鎭�
-     * @return 璁稿彲淇℃伅
-     */
-    @Override
-    public TokenVO createToken(SessionInfo sessionInfo) {
-        return createToken(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS, sessionInfo);
-    }
-
-    /**
-     * 鍒涘缓璁稿彲鐨勪俊鎭�
-     * @param key token鍦╮edis涓殑key
-     * @param sessionInfo session鐨勪俊鎭�
-     * @return 璁稿彲淇℃伅
-     */
-    @Override
-    public TokenVO createToken(String key, SessionInfo sessionInfo) {
-        if(StringUtils.isBlank(sessionInfo.getToken())) {
-            String token = Md5.md5(VciBaseUtil.getPk() + "_" + sessionInfo.getUserId());
-            sessionInfo.setToken(token);
-        }
-        if(StringUtils.isBlank(key)){
-            key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS;
-        }
-        refreshToken(key, sessionInfo);
-        Map<String,Object> claimsMap = new HashMap<>();
-        claimsMap.put(TokenKeyConstant.JWT_TOKEN_KEY,sessionInfo.getToken());
-        claimsMap.put(TokenKeyConstant.JWT_USER_KEY,sessionInfo.getUserOid());
-        claimsMap.put(TokenKeyConstant.JWT_USER_NAME_KEY,sessionInfo.getUserName());
-        claimsMap.put(TokenKeyConstant.JWT_USER_CODE_KEY,sessionInfo.getUserId());
-        TokenVO tokenVO = new TokenVO();
-        tokenVO.setAccessToken(JwtUtils.createToken(claimsMap));
-        tokenVO.setExpireTime(TokenKeyConstant.EXPIRATION);
-        return tokenVO;
-    }
-
-    /**
-     * 鍒锋柊token
-     * @param sessionInfo session鐨勪俊鎭�
-     */
-    @Override
-    public void refreshToken(SessionInfo sessionInfo) {
-        refreshToken(TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS, sessionInfo);
-    }
-
-    /**
-     * 鍒锋柊token
-     * @param key token鍦╮edis涓殑key
-     * @param sessionInfo session鐨勪俊鎭�
-     */
-    @Override
-    public void refreshToken(String key, SessionInfo sessionInfo) {
-        if(sessionInfo!=null && StringUtils.isNotBlank(sessionInfo.getToken())){
-            if(StringUtils.isBlank(key)){
-                key = TokenKeyConstant.TOKEN_KEY_PREFIX_IN_REDIS;
-            }
-            String redisKey = key + sessionInfo.getToken();
-            redisService.setCacheObject(redisKey, sessionInfo, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES);
-        }
     }
 
     /**
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java
index 0d2719c..88094a0 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java
@@ -322,7 +322,7 @@
         statePool.name = statusDTO.getId();
         statePool.description = statusDTO.getDescription()==null?"":statusDTO.getDescription();
         String userId = VciBaseUtil.getCurrentUserId();
-        long now = VciDateUtil.getTime(VciDateUtil.getNow());
+        long now = VciDateUtil.getNowTime();
         statePool.creator = userId;
         statePool.createTime = now;
         statePool.modifier = userId;
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
index 1d5153f..b95a7d5 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
@@ -259,7 +259,7 @@
         List<LifeCycle> unExistLifeCycleList = new ArrayList<LifeCycle>();
         List<LifeCycle> editLifeCycleList = new ArrayList<LifeCycle>();
         String userId = WebUtil.getCurrentUserId();
-        long now = VciDateUtil.getTime(VciDateUtil.getNow());
+        long now = VciDateUtil.getNowTime();
         //寰幆鍒嗘瀽闇�瑕佹坊鍔犺繕鏄慨鏀�
         for(OsLifeCycleDTO lifeCycleDTO : lifeCycleDTOList){
             String lifeCycleId = lifeCycleDTO.getId().toLowerCase().trim();
@@ -378,7 +378,7 @@
         List<AttributeDef> unExistAttrList = new ArrayList<AttributeDef>();
         List<AttributeDef> editAttrList = new ArrayList<AttributeDef>();
         String userId = WebUtil.getCurrentUserId();
-        long now = VciDateUtil.getTime(VciDateUtil.getNow());
+        long now = VciDateUtil.getNowTime();
         //寰幆鍒嗘瀽闇�瑕佹坊鍔犺繕鏄慨鏀�
         for (OsAttributeDTO attributeDTO : attributeDTOList) {
             String attrId = attributeDTO.getId().toLowerCase().trim();
@@ -578,7 +578,7 @@
         List<BizType> unExistBtmList = new ArrayList<BizType>();
         List<BizType> editBtmList = new ArrayList<BizType>();
         String userId = WebUtil.getCurrentUserId();
-        long now = VciDateUtil.getTime(VciDateUtil.getNow());
+        long now = VciDateUtil.getNowTime();
 
         for (OsBtmTypeDTO btmTypeDTO : btmTypeDTOList) {
             String btmId = btmTypeDTO.getId().toLowerCase().trim();
@@ -1210,7 +1210,7 @@
         List<LinkType> addLinkTypeList = new ArrayList<LinkType>();
         List<LinkType> editLinkTypeList = new ArrayList<LinkType>();
         String userId = WebUtil.getCurrentUserId();
-        long now = VciDateUtil.getTime(VciDateUtil.getNow());
+        long now = VciDateUtil.getNowTime();
         for(OsLinkTypeDTO linkTypeDTO : linkTypeDTOS){
             String linkId = linkTypeDTO.getId().toLowerCase().trim();
             LinkType linkType = null;
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java
index 34d927f..4e4fe39 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java
@@ -28,7 +28,7 @@
 	@Override
 	@VciUnLog
 	public InvocationInfo getInvocationInfo() {
-		SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+		SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
 		if(sessionInfo == null){
 			return ClientSessionUtility.getInvocation();
 		}else {
@@ -61,6 +61,6 @@
 	 * @return 浼氳瘽鐨勫璞�
 	 */
 	public SessionInfo getSessionInfo() {
-		return WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+		return WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
 	}
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java
index 5d73662..65827a3 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java
@@ -414,7 +414,7 @@
 				clo.setCreator(WebUtil.getCurrentUserId());
 			}
 			if(clo.getCreateTime() == 0){
-				clo.setCreateTime(VciDateUtil.getTime(VciDateUtil.getNow()));
+				clo.setCreateTime(VciDateUtil.getNowTime());
 			}
 			if(StringUtils.isBlank(clo.getLastModifier())){
 				clo.setLastModifier(clo.getCreator());
@@ -481,7 +481,7 @@
 		newClo.setLinkObject(lo);
 		newClo.setOid((new ObjectUtility()).getNewObjectID36());
 		newClo.setCreator(WebUtil.getCurrentUserId());
-		newClo.setCreateTime(VciDateUtil.getTime(VciDateUtil.getNow()));
+		newClo.setCreateTime(VciDateUtil.getNowTime());
 		newClo.setLastModifier(newClo.getCreator());
 		newClo.setLastModifyTime(newClo.getCreateTime());
 		newClo.setTs(newClo.getCreateTime());
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java
index 0ea5c4b..144b948 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java
@@ -41,7 +41,7 @@
 	@Override
 	public void addOperateLog(VciLogObjectBO logObject) {
 		//VCIInvocationInfo vcii = WebThreadLocalUtil.getCurrentUserInvocationInfoInThread().get();
-		SessionInfo si = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+		SessionInfo si = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
 		if(si!=null){
 			logObject.setUserId(si.getUserId());
 			logObject.setUserName(si.getUserName());
@@ -91,7 +91,7 @@
 				UserEntityInfo ue = new UserEntityInfo();
 				ue.modules = log.getModelName();
 				ue.userName = log.getUserId();
-				WebThreadLocalUtil.getCurrentUserSessionInfoInThread().set(si);
+				WebThreadLocalUtil.setCurrentUserSessionInfoInThread(si);
 				if(log.isDebug()){
 					log.setDescription(log.getDescription() + "," + log.getController() + "/" + log.getMethod());
 				}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/WebUtil.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/WebUtil.java
index 15dd76a..6dbfdcb 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/WebUtil.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/WebUtil.java
@@ -187,7 +187,7 @@
 	 * @return 鐢ㄦ埛瀵硅薄锛屼絾鏄笉鎶涘嚭寮傚父
 	 */
 	public static SessionInfo getCurrentUserSessionInfoNotException() {
-		return WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+		return WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
 	}
 
 	/**
@@ -195,7 +195,7 @@
 	 * @param sessionInfo 浼氳瘽淇℃伅
 	 */
 	public static synchronized void setSessionInfo(SessionInfo sessionInfo){
-		 WebThreadLocalUtil.getCurrentUserSessionInfoInThread().set(sessionInfo);
+		 WebThreadLocalUtil.setCurrentUserSessionInfoInThread(sessionInfo);
 	}
 
 	/**
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/resources/application-dev.yml b/Source/plt-web/plt-web-parent/plt-web/src/main/resources/application-dev.yml
index 5b48f4c..0ac1964 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/resources/application-dev.yml
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/resources/application-dev.yml
@@ -73,9 +73,16 @@
 ##web閰嶇疆
 vciweb:
     debug: true
+
 file-preview:
   enabled: true
   preview-service-url: "http://dev.yunkeruida.top:28090/vciFilePreview/ajaxPreview.html"
   preview-system-key: plt2020
 
+vcispringmvc:
+  enabled: true
+  #涓嶆牎楠屽畨鍏ㄧ殑閾炬帴鍦板潃
+  un-check-urls:
+  #涓嶆洿鏂拌姹傛椂闂寸殑閾炬帴鍦板潃
+  un-storage-request-time-urls:
 

--
Gitblit v1.9.3