diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/service/CorePlatformService.java b/admin-core/src/main/java/com/ibeetl/admin/core/service/CorePlatformService.java index e95082f1..a40efe4e 100644 --- a/admin-core/src/main/java/com/ibeetl/admin/core/service/CorePlatformService.java +++ b/admin-core/src/main/java/com/ibeetl/admin/core/service/CorePlatformService.java @@ -26,7 +26,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import static com.ibeetl.admin.core.util.servlet.ServletUtils.getRequest; -import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUserId; /** * 系统平台功能访问入口,所有方法应该支持缓存或者快速访问 @@ -426,7 +425,7 @@ public class CorePlatformService { public Object logout() { httpRequestLocal.removeAllSessionValue(); httpRequestLocal.removeAllAttributeValue(); - tokenSessionMap.remove(getUserId()); +// tokenSessionMap.remove(getUserId()); return getRequest().getContextPath(); } } diff --git a/web/src/main/java/cn/jlw/Interceptor/AuthenticationInterceptor.java b/web/src/main/java/cn/jlw/Interceptor/AuthenticationInterceptor.java index 9309a48d..26ae2463 100644 --- a/web/src/main/java/cn/jlw/Interceptor/AuthenticationInterceptor.java +++ b/web/src/main/java/cn/jlw/Interceptor/AuthenticationInterceptor.java @@ -1,5 +1,6 @@ package cn.jlw.Interceptor; +import cn.hutool.extra.spring.SpringUtil; import cn.jlw.util.ToolUtils; import com.alibaba.fastjson.JSONArray; import com.auth0.jwt.JWT; @@ -8,6 +9,11 @@ import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.DecodedJWT; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.ibeetl.admin.core.rbac.UserLoginInfo; +import com.ibeetl.admin.core.service.CoreUserService; import com.ibeetl.jlw.entity.AbstractToken; import com.ibeetl.jlw.service.WebPlatformService; import org.apache.commons.lang3.StringUtils; @@ -26,8 +32,10 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; import static cn.jlw.token.TokenService.tokenMap; +import static com.ibeetl.admin.core.util.servlet.ServletUtils.getRequest; /** * @author TLT @@ -40,7 +48,18 @@ public class AuthenticationInterceptor implements HandlerInterceptor { @Autowired ActionLog actionLog; - public static Map indexTokenMap = new ConcurrentHashMap<>(); +// public static Map indexTokenMap = new ConcurrentHashMap<>(); +// public static DefaultRedisMap indexTokenMap = new DefaultRedisMap<>("core:token:indexTokenMap", SpringUtil.getBean("stringRedisTemplate")); + public static LoadingCache indexTokenMap = CacheBuilder.newBuilder() + .expireAfterAccess(8, TimeUnit.HOURS) + .build(new CacheLoader() { + // 处理缓存键不存在缓存值时的处理逻辑 + @Override + public String load(String key) { + return "不存在的key"; + } + }); + public static Map keyIdOpenIdMap = new ConcurrentHashMap<>(); public static Map workMap = new ConcurrentHashMap<>(); //用来存储后台工作的人员正在进行的操作 @@ -58,25 +77,26 @@ public class AuthenticationInterceptor implements HandlerInterceptor { public static boolean run(ActionLog actionLog,HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception{ - if(null != httpServletRequest - && null != httpServletRequest.getRequestURI() - && httpServletRequest.getRequestURI().endsWith("pzwj.exe")){ + if(null != httpServletRequest) { + String requestURI = httpServletRequest.getRequestURI(); + if (null != requestURI && requestURI.endsWith("pzwj.exe")) { - String fileName = "配置工具.exe"; + String fileName = "配置工具.exe"; - if(null != httpServletRequest && null != httpServletRequest.getHeader("User-Agent")){ - if (httpServletRequest.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { - fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO8859-1"); // firefox浏览器 - }else if (httpServletRequest.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) { - fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO8859-1");// 谷歌 - }else { + if (null != httpServletRequest && null != httpServletRequest.getHeader("User-Agent")) { + if (httpServletRequest.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { + fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO8859-1"); // firefox浏览器 + } else if (httpServletRequest.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) { + fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO8859-1");// 谷歌 + } else { + fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器 或其他浏览器 + } + } else { fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器 或其他浏览器 } - }else { - fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器 或其他浏览器 - } - httpServletResponse.setHeader("Content-Disposition", "attachment; filename="+fileName); + httpServletResponse.setHeader("Content-Disposition", "attachment; filename=" + fileName); + } } // 如果不是映射到方法直接通过 @@ -175,23 +195,65 @@ public class AuthenticationInterceptor implements HandlerInterceptor { } if(StringUtils.isBlank(token)&&httpServletRequest.getRequestURL().toString().contains("index.do")){//从参数中获取 - if(null != httpServletRequest.getParameter("key_id")){ - token = indexTokenMap.get(httpServletRequest.getParameter("key_id")); + String key_id = httpServletRequest.getParameter("key_id"); + if(null != key_id){ + token = indexTokenMap.getUnchecked(key_id); } } - String loginTime = ""; + + String[] jwtStrings = jwtTokenSplitDateTime(token); + String loginTime = jwtStrings[1]; + token = jwtStrings[0]; + + httpServletRequest.setAttribute("token",token); + httpServletRequest.setAttribute("loginTime",loginTime); + + return token; + } + + /** + * 功能描述:
+ * 处理jwtToken 串和时间戳 + * + * @param token + * @return {@link String[]} + * @Author: lx + * @Date: 2022/12/3 22:58 + */ + public static String[] jwtTokenSplitDateTime(String token) { + String[] str = new String[2]; //断token的尾巴 if(StringUtils.isNotBlank(token)){ - if(token.split("\\.").length > 3){ - loginTime = token.split("\\.")[3]; + String[] split = token.split("\\."); + if(split.length > 3){ + String loginTime = split[3]; token = token.replace("."+loginTime,""); + str[0] = token; + str[1] = loginTime; } } + return str; + } - httpServletRequest.setAttribute("token",token); - httpServletRequest.setAttribute("loginTime",loginTime); + /** + * 功能描述:
+ * 根据KeyId填充当前的request.session属性。缺点:一次登录可能要浪费两块空间 + * keyId只能用一次 + * + * @Author: lx + * @Date: 2022/12/3 22:37 + */ + public static String fullSessionInfoWithKeyId() { - return token; + WebPlatformService webPlatformService = SpringUtil.getBean(WebPlatformService.class); + CoreUserService coreUserService = SpringUtil.getBean(CoreUserService.class); + String jwtToken = getToken(getRequest()); + + String coreUserId = JWT.decode(jwtToken).getAudience().get(0); + UserLoginInfo userLoginInfo = webPlatformService + .buildLoginInfo(coreUserService.getUserById(Long.valueOf(coreUserId))); + webPlatformService.setLoginUser(userLoginInfo); + return jwtToken; } } \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/entity/Student.java b/web/src/main/java/com/ibeetl/jlw/entity/Student.java index 66854b73..1cdb4c78 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/Student.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/Student.java @@ -261,7 +261,7 @@ public class Student extends BaseEntity implements AbstractToken { @Override public String getId() { - return this.getStudentId().toString(); + return this.getUserId().toString(); } @Override diff --git a/web/src/main/java/com/ibeetl/jlw/entity/Teacher.java b/web/src/main/java/com/ibeetl/jlw/entity/Teacher.java index deadba6f..612fdf6a 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/Teacher.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/Teacher.java @@ -247,7 +247,7 @@ public class Teacher extends BaseEntity implements AbstractToken { @Override public String getId() { - return getTeacherId().toString(); + return getUserId().toString(); } @Override diff --git a/web/src/main/java/com/ibeetl/jlw/service/CoreUserWxService.java b/web/src/main/java/com/ibeetl/jlw/service/CoreUserWxService.java index a46632d0..f86ca399 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/CoreUserWxService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/CoreUserWxService.java @@ -1,12 +1,8 @@ package com.ibeetl.jlw.service; -import cn.hutool.core.util.ObjectUtil; import cn.jlw.util.ToolUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.ibeetl.admin.core.entity.CoreOrg; -import com.ibeetl.admin.core.entity.CoreUser; -import com.ibeetl.admin.core.rbac.UserLoginInfo; import com.ibeetl.admin.core.service.CoreBaseService; import com.ibeetl.admin.core.service.CoreUserService; import com.ibeetl.admin.core.util.PlatformException; @@ -154,30 +150,4 @@ public class CoreUserWxService extends CoreBaseService{ return null; } } - - /** - * 构建登录实体 - * @return - */ - public UserLoginInfo buildLoginInfoWithWx(CoreUserWx coreUserWx){ - // 构建的返回对象 - UserLoginInfo loginInfo = new UserLoginInfo(); - if (ObjectUtil.isNotEmpty(coreUserWx)) { - // 微信登录信息,绑定的系统级用户 - CoreUser bindCoreUser = coreUserWx.getCoreUser(); - if (bindCoreUser == null) { - return null; - } - // 查询这个对象所在的机构列表 - List orgs = coreUserService.getUserOrg(bindCoreUser.getId(), bindCoreUser.getOrgId()); - - loginInfo.setUser(bindCoreUser); - loginInfo.setOrgs(orgs); - loginInfo.setCurrentOrg(orgs.get(0)); - return loginInfo; - } - - return null; - } - } diff --git a/web/src/main/java/com/ibeetl/jlw/service/MsgHandler.java b/web/src/main/java/com/ibeetl/jlw/service/MsgHandler.java index b94587c7..f0f43f07 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/MsgHandler.java +++ b/web/src/main/java/com/ibeetl/jlw/service/MsgHandler.java @@ -20,6 +20,7 @@ import java.util.concurrent.ConcurrentHashMap; import static cn.jlw.Interceptor.AuthenticationInterceptor.indexTokenMap; + /** * @author Binary Wang */ @@ -73,7 +74,7 @@ public class MsgHandler extends AbstractHandler { .build(); } - UserLoginInfo userLoginInfo = coreUserWxService.buildLoginInfoWithWx(coreUserWx); + UserLoginInfo userLoginInfo = webPlatformService.buildLoginInfo(coreUserWx.getCoreUser()); if (userLoginInfo == null) { map.put("type", "login"); map.put("status", "error"); diff --git a/web/src/main/java/com/ibeetl/jlw/service/WebPlatformService.java b/web/src/main/java/com/ibeetl/jlw/service/WebPlatformService.java index 5d78c1c0..ee70dca6 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/WebPlatformService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/WebPlatformService.java @@ -1,12 +1,14 @@ package com.ibeetl.jlw.service; import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; import cn.jlw.token.TokenService; import com.ibeetl.admin.core.entity.CoreOrg; import com.ibeetl.admin.core.entity.CoreUser; import com.ibeetl.admin.core.enums.MenuEnums; import com.ibeetl.admin.core.rbac.UserLoginInfo; import com.ibeetl.admin.core.service.CorePlatformService; +import com.ibeetl.admin.core.service.CoreUserService; import com.ibeetl.admin.core.util.HttpRequestLocal; import com.ibeetl.jlw.entity.Student; import com.ibeetl.jlw.entity.Teacher; @@ -34,6 +36,8 @@ public class WebPlatformService { @Autowired private CorePlatformService corePlatformService; @Autowired private TokenService tokenService; + @Autowired private CoreUserService coreUserService; + /** * 根据身份,将用户信息存到Session中 * @param user @@ -118,4 +122,24 @@ public class WebPlatformService { } return token; } + + /** + * 构建登录实体 + * @return + */ + public UserLoginInfo buildLoginInfo(CoreUser bindCoreUser){ + // 构建的返回对象 + UserLoginInfo loginInfo = new UserLoginInfo(); + if (ObjectUtil.isNotEmpty(bindCoreUser)) { + // 查询这个对象所在的机构列表 + List orgs = coreUserService.getUserOrg(bindCoreUser.getId(), bindCoreUser.getOrgId()); + + loginInfo.setUser(bindCoreUser); + loginInfo.setOrgs(orgs); + loginInfo.setCurrentOrg(orgs.get(0)); + return loginInfo; + } + + return null; + } } diff --git a/web/src/main/java/com/ibeetl/jlw/web/IndexController.java b/web/src/main/java/com/ibeetl/jlw/web/IndexController.java index f5d58ac5..7cf03a7e 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/IndexController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/IndexController.java @@ -51,7 +51,7 @@ import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.*; -import static cn.jlw.Interceptor.AuthenticationInterceptor.getToken; +import static cn.jlw.Interceptor.AuthenticationInterceptor.fullSessionInfoWithKeyId; import static cn.jlw.Interceptor.AuthenticationInterceptor.indexTokenMap; import static cn.jlw.token.TokenService.updateByIds; import static com.ibeetl.admin.core.enums.MenuEnums.JT_S_02; @@ -950,23 +950,14 @@ public class IndexController { //跳转到电脑端首页 @RequestMapping("/index.do") public void index(HttpServletRequest request, HttpServletResponse response, - @TTeacher Teacher teacher, @TStudent Student student, @SCoreUser CoreUser coreUser) { + @TTeacher Teacher teacher, @TStudent Student student) { - log.error("登录用户信息:"+ JSONUtil.toJsonStr(coreUser)); log.error("教师用户信息:"+ JSONUtil.toJsonStr(teacher)); log.error("学生用户信息:"+ JSONUtil.toJsonStr(student)); - String redirectUrl = ""; //判断是老师还是学生 if(null != student || null != teacher){//学生 try { - - if(request.getHeader("Referer").contains("/server")){ - redirectUrl = request.getHeader("Referer").substring(0,request.getHeader("Referer").indexOf("/server")); - }else { - redirectUrl = request.getHeader("Referer").substring(0,request.getHeader("Referer").lastIndexOf("/") + 1); - } - - String token = getToken(request); + String token = fullSessionInfoWithKeyId(); // UniversitiesCollegesJurisdictionExperimentalSystem uSystem = (UniversitiesCollegesJurisdictionExperimentalSystem)platformService.getOther(token);