提交 5ed4dfea 作者: 王峰

研究中心单点登录克虏宝

上级 3cbc58dc
...@@ -6,6 +6,7 @@ import com.zzsn.event.constant.Result; ...@@ -6,6 +6,7 @@ import com.zzsn.event.constant.Result;
import com.zzsn.event.entity.SysLoginModel; import com.zzsn.event.entity.SysLoginModel;
import com.zzsn.event.service.EventLoginService; import com.zzsn.event.service.EventLoginService;
import com.zzsn.event.util.RedisUtil; import com.zzsn.event.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.Cursor;
...@@ -14,6 +15,8 @@ import org.springframework.data.redis.core.ScanOptions; ...@@ -14,6 +15,8 @@ import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
...@@ -22,48 +25,63 @@ import java.util.Set; ...@@ -22,48 +25,63 @@ import java.util.Set;
* @author wangFeng * @author wangFeng
* @date 2024/10/22 14:29 * @date 2024/10/22 14:29
*/ */
@Slf4j
@Service @Service
public class EventLoginServiceImpl implements EventLoginService { public class EventLoginServiceImpl implements EventLoginService {
@Value("${spring.profiles.active:dev}") @Value("${spring.profiles.active:dev}")
private String evn; private String evn;
@Value("${clbLogin.url}") @Value("${clbLogin.url}")
private String loginUrl; private String loginUrl;
@Resource //@Resource
private RedisUtil redisUtil; //private RedisUtil redisUtil;
private Integer successCode = 200; private Integer successCode = 200;
public static final String CACHE_KEY = "event:sso:"; public static final String CACHE_KEY = "event:sso:";
private Map<String, Map<String, Object>> CACHE_MAP = new HashMap<>(16);
@Override @Override
public Result<?> loginBS(SysLoginModel sysLoginModel) { public Result<?> loginBS(SysLoginModel sysLoginModel) {
String username = sysLoginModel.getUsername(); String username = sysLoginModel.getUsername();
String cacheKey = CACHE_KEY + evn + ":" +username; String cacheKey = CACHE_KEY + evn + ":" +username;
if (redisUtil.hasKey(cacheKey)) { if (CACHE_MAP.containsKey(cacheKey)) {
Map<String, Object> cacheMap = (Map<String, Object>) redisUtil.get(cacheKey); Map<String, Object> map = CACHE_MAP.get(cacheKey);
SysLoginModel sysLoginModelCache = (SysLoginModel) cacheMap.get("sysLoginModel"); SysLoginModel sysLoginModelCache = (SysLoginModel) map.get("sysLoginModel");
if (sysLoginModelCache.getPassword().equals(sysLoginModel.getPassword()) if (sysLoginModelCache.getPassword().equals(sysLoginModel.getPassword())
&& sysLoginModelCache.getCaptcha().equals(sysLoginModel.getCaptcha()) && sysLoginModelCache.getCaptcha().equals(sysLoginModel.getCaptcha())
&& sysLoginModelCache.getCheckKey().equals(sysLoginModel.getCheckKey())) { && sysLoginModelCache.getCheckKey().equals(sysLoginModel.getCheckKey())) {
// 使用缓存 LocalDateTime cacheDate = (LocalDateTime) map.get("cacheDate");
Result loginResult = (Result) cacheMap.get("loginResult"); LocalDateTime now = LocalDateTime.now();
return loginResult; long minutesDiff = ChronoUnit.MINUTES.between(cacheDate, now);
if (minutesDiff < 10) {
// 使用缓存
Result loginResult = (Result) map.get("loginResult");
return loginResult;
}
} }
//信息变了就需要重新登录 //信息变了就需要重新登录
redisUtil.del(cacheKey); CACHE_MAP.remove(cacheKey);
} }
return doClbLogin(sysLoginModel); return doClbLogin(sysLoginModel);
} }
@Override @Override
public void redoLogin() { public void redoLogin() {
String cacheKey = CACHE_KEY + evn + ":*"; // String cacheKey = CACHE_KEY + evn + ":*";
ScanOptions options = ScanOptions.scanOptions().match(cacheKey).count(100).build(); // ScanOptions options = ScanOptions.scanOptions().match(cacheKey).count(100).build();
Cursor<String> scan = redisUtil.getRedisTemplate().scan(options); // Cursor<String> scan = redisUtil.getRedisTemplate().scan(options);
while (scan.hasNext()){ // while (scan.hasNext()){
String next = scan.next(); // String next = scan.next();
Map<String, Object> cacheMap = (Map<String, Object>) redisUtil.get(next); // Map<String, Object> cacheMap = (Map<String, Object>) redisUtil.get(next);
SysLoginModel sysLoginModelCache = (SysLoginModel) cacheMap.get("sysLoginModel"); // SysLoginModel sysLoginModelCache = (SysLoginModel) cacheMap.get("sysLoginModel");
doClbLogin(sysLoginModelCache); // doClbLogin(sysLoginModelCache);
// }
if (CACHE_MAP != null) {
Set<String> keys = CACHE_MAP.keySet();
for (String key : keys) {
Map<String, Object> map = CACHE_MAP.get(key);
SysLoginModel sysLoginModelCache = (SysLoginModel) map.get("sysLoginModel");
doClbLogin(sysLoginModelCache);
}
} }
} }
...@@ -86,7 +104,9 @@ public class EventLoginServiceImpl implements EventLoginService { ...@@ -86,7 +104,9 @@ public class EventLoginServiceImpl implements EventLoginService {
Map<String, Object> cacheMap = new HashMap<>(2); Map<String, Object> cacheMap = new HashMap<>(2);
cacheMap.put("sysLoginModel", sysLoginModel); cacheMap.put("sysLoginModel", sysLoginModel);
cacheMap.put("loginResult", bean); cacheMap.put("loginResult", bean);
redisUtil.set(cacheKey, cacheMap, 60 * 15); cacheMap.put("cacheDate", LocalDateTime.now());
CACHE_MAP.put(cacheKey, cacheMap);
log.info("缓存用户结束:"+cacheKey);
} }
} catch (Exception e) { } catch (Exception e) {
bean = Result.FAIL(); bean = Result.FAIL();
......
...@@ -19,7 +19,7 @@ public class RefreshLoginTask { ...@@ -19,7 +19,7 @@ public class RefreshLoginTask {
@Resource @Resource
private EventLoginService eventLoginService; private EventLoginService eventLoginService;
@Scheduled(cron = "0 0/2 * * * ?") @Scheduled(cron = "0 0/7 * * * ?")
public void redoLogin() { public void redoLogin() {
log.info("研究中心事件用户重新登录"); log.info("研究中心事件用户重新登录");
eventLoginService.redoLogin(); eventLoginService.redoLogin();
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论