dangsn
2024-06-11 b6dee87c91bfdcb68fcc456c9a2ec46b2ed7cbe3
登录和权限校验功能
已修改23个文件
已删除1个文件
已添加1个文件
696 ■■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-base/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/TokenKeyConstant.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/constant/VConstant.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSecurityInterceptor.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/interceptor/VciSessionForLoginI.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/SessionInfo.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/ControllerUtil.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciDateUtil.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/WebThreadLocalUtil.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/bo/LoginResultBO.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/CacheNameConstant.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LoginController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/LoginServiceI.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/WebUtil.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/resources/application-dev.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>
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中的用户主键的Key
@@ -55,7 +55,7 @@
    /**
     * JWT中token的key
     */
    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;
}
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" };
}
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;
            //被T下线由websocket直接提醒
            //被踢下线由websocket直接提醒
        }else{
            SessionInfo sessionInfo = getSessionInfo(userToken);
            if(sessionInfo == null){
                //也是说明不存在,被T下线时也获取不到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 ç›¸åº”对象
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在redis中的key。
     * @param sessionInfo session的信息
     * @return è®¸å¯ä¿¡æ¯
     */
    TokenVO createToken(String key, SessionInfo sessionInfo) ;
    /**
     * åˆ·æ–°ç¼“存中的token
     * @param sessionInfo session的信息
     */
    void refreshToken(SessionInfo sessionInfo);
    /**
     * åˆ·æ–°ç¼“存中的token
     * @param key token在redis中的key
     * @param sessionInfo session的信息
     */
    void refreshToken(String key, SessionInfo sessionInfo);
}
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 +
                '}';
    }
}
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;
        }
    }
    /**
     * å†…容解码
     *
     * @param str å†…容
     * @return è§£ç åŽçš„内容
     */
    public static String urlDecode(String str) {
        try {
            return URLDecoder.decode(str, VConstant.UTF8);
        } catch (UnsupportedEncodingException e) {
            return StringUtils.EMPTY;
        }
    }
}
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{
Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciDateUtil.java
@@ -1075,6 +1075,15 @@
    }
    /**
     * èŽ·å–å½“å‰æ—¶é—´çš„time值
     * @Return java.lang.Long
     */
    public static Long getNowTime() {
        Date date = new Date();
        return date.getTime();
    }
    /**
     * å°†timestamp转换为Date
     * @param timestamp timestamp
     * @Return java.util.Date
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>();
    /**
     * èŽ·å–å½“å‰ç”¨æˆ·çš„session对象
     * @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);
    }
}
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);
        //说明是jwt的token
        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{
                //说明是jwt的token
                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在redis中的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在redis中的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);
            //因为可能需要退出登录,或同一用户只能在线一个,故需要存储,用户和jwtToken的关系
            String tokenKey = CacheNameConstant.cacheKey(CacheNameConstant.USERID_TOKEN_KEY,sessionInfo.getUserId());
            redisService.setCacheObject(tokenKey, redisKey, webProperties.getClientSessionAliveMax()!=0?webProperties.getClientSessionAliveMax(): TokenKeyConstant.EXPIRATION, TimeUnit.MINUTES);
        }
    }
    /**
     * jwt的token改成
     * @param jwtToken jwt的许可
     * @return åœ¨redis里的信息
     */
    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;
    }
}
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 + '\'' +
                '}';
    }
}
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 +
                '}';
    }
}
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和token关系的key
     */
    public static final String USERID_TOKEN_KEY = "userid_token_key:";
    /**
     * è¿”回拼接后的key
     *
     * @param cacheKey      ç¼“å­˜key
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java
ÎļþÒÑɾ³ý
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);
        }
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在redis中的key
     * @param sessionInfo session的信息
     */
    void refreshToken(String key, SessionInfo sessionInfo);
    /**
     * åˆ›å»ºè®¸å¯çš„信息
     * @param sessionInfo session的信息
     * @return è®¸å¯ä¿¡æ¯
     */
    TokenVO createToken(SessionInfo sessionInfo) ;
    /**
     * åˆ›å»ºè®¸å¯çš„信息
     * @param key token在redis中的key。
     * @param sessionInfo session的信息
     * @return è®¸å¯ä¿¡æ¯
     */
    TokenVO createToken(String key, SessionInfo sessionInfo) ;
}
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;
        }
        //说明已经登录了,那应该取消原来的登录
        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在redis中的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在redis中的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);
        }
    }
    /**
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;
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;
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();
    }
}
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());
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());
                }
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);
    }
    /**
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: