mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-07-21 06:25:07 +08:00
移除超时的在线用户&单元测试
This commit is contained in:
@ -20,7 +20,7 @@ public interface SysUserSessionMapper extends BaseMapperX<SysUserSessionDO> {
|
||||
.likeIfPresent("user_ip", reqVO.getUserIp()));
|
||||
}
|
||||
|
||||
default List<SysUserSessionDO> selectSessionTimeout() {
|
||||
default List<SysUserSessionDO> selectListBySessionTimoutLt() {
|
||||
return selectList(new QueryWrapperX<SysUserSessionDO>().lt("session_timeout",new Date()));
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ public interface SysRedisKeyConstants {
|
||||
|
||||
RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登陆用户的缓存",
|
||||
"login_user:%s", // 参数为 sessionId
|
||||
STRING, LoginUser.class, Duration.ofMinutes(30));
|
||||
STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
|
||||
|
||||
RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存",
|
||||
"captcha_code:%s", // 参数为 uuid
|
||||
|
@ -1,11 +1,13 @@
|
||||
package cn.iocoder.dashboard.modules.system.dal.redis.auth;
|
||||
|
||||
import cn.iocoder.dashboard.framework.security.core.LoginUser;
|
||||
import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService;
|
||||
import cn.iocoder.dashboard.util.json.JsonUtils;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.Duration;
|
||||
|
||||
import static cn.iocoder.dashboard.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER;
|
||||
|
||||
@ -19,6 +21,8 @@ public class SysLoginUserRedisDAO {
|
||||
|
||||
@Resource
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
@Resource
|
||||
private SysUserSessionService sysUserSessionService;
|
||||
|
||||
public LoginUser get(String sessionId) {
|
||||
String redisKey = formatKey(sessionId);
|
||||
@ -27,7 +31,8 @@ public class SysLoginUserRedisDAO {
|
||||
|
||||
public void set(String sessionId, LoginUser loginUser) {
|
||||
String redisKey = formatKey(sessionId);
|
||||
stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(loginUser), LOGIN_USER.getTimeout());
|
||||
stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(loginUser),
|
||||
Duration.ofMillis(sysUserSessionService.getSessionTimeoutMillis()));
|
||||
}
|
||||
|
||||
public void delete(String sessionId) {
|
||||
|
@ -23,7 +23,7 @@ public class SysUserSessionTimeoutJob implements JobHandler {
|
||||
public String execute(String param) throws Exception {
|
||||
log.info("[execute][执行任务:{}]", "移除超时的在线用户");
|
||||
long timeoutCount = sysUserSessionService.clearSessionTimeout();
|
||||
log.info("[execute][执行任务:{}]", "移除超时的在线用户完成" + timeoutCount);
|
||||
log.info("[execute][执行任务:{}:{}]", "移除超时的在线用户完成", timeoutCount);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -62,8 +62,8 @@ public interface SysUserSessionService {
|
||||
|
||||
/**
|
||||
* 移除超时的在线用户
|
||||
* @param
|
||||
* @return {@link Long}
|
||||
*
|
||||
* @return {@link Long } 移出的超时用户数量
|
||||
* @author Lyon
|
||||
* @date 2021/3/7
|
||||
**/
|
||||
|
@ -13,16 +13,18 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.auth.SysUserSessionMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.redis.auth.SysLoginUserRedisDAO;
|
||||
import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService;
|
||||
import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
|
||||
import cn.iocoder.dashboard.util.date.DateUtils;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.Duration;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.dashboard.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER;
|
||||
import static cn.iocoder.dashboard.util.collection.CollectionUtils.convertSet;
|
||||
import static cn.iocoder.dashboard.util.date.DateUtils.addTime;
|
||||
|
||||
/**
|
||||
* 在线用户 Session Service 实现类
|
||||
@ -53,7 +55,7 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
|
||||
// 写入 DB 中
|
||||
SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
|
||||
.userId(loginUser.getId()).userIp(userIp).userAgent(userAgent)
|
||||
.sessionTimeout(DateUtils.addTime(LOGIN_USER.getTimeout()))
|
||||
.sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis())))
|
||||
.build();
|
||||
userSessionMapper.insert(userSession);
|
||||
// 返回 Session 编号
|
||||
@ -68,7 +70,7 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
|
||||
// 更新 DB 中
|
||||
SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build();
|
||||
updateObj.setUpdateTime(new Date());
|
||||
updateObj.setSessionTimeout(DateUtils.addTime(LOGIN_USER.getTimeout()));
|
||||
updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis())));
|
||||
userSessionMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@ -106,15 +108,17 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
|
||||
@Override
|
||||
public long clearSessionTimeout() {
|
||||
// 获取db里已经超时的用户列表
|
||||
Long timeoutCount = 0L;
|
||||
List<SysUserSessionDO> sessionTimeoutDOS = userSessionMapper.selectSessionTimeout();
|
||||
for (SysUserSessionDO sessionDO : sessionTimeoutDOS) {
|
||||
// 确认已经超时,移出在线用户列表
|
||||
if (loginUserRedisDAO.get(sessionDO.getId()) == null) {
|
||||
timeoutCount += userSessionMapper.deleteById(sessionDO.getId());
|
||||
}
|
||||
List<SysUserSessionDO> sessionTimeoutDOS = userSessionMapper.selectListBySessionTimoutLt();
|
||||
List<String> timeoutIdList = sessionTimeoutDOS
|
||||
.stream()
|
||||
.filter(sessionDO -> loginUserRedisDAO.get(sessionDO.getId()) == null)
|
||||
.map(SysUserSessionDO::getId)
|
||||
.collect(Collectors.toList());
|
||||
// 确认已经超时,按批次移出在线用户列表
|
||||
if (CollUtil.isNotEmpty(timeoutIdList)) {
|
||||
Lists.partition(timeoutIdList, 100).forEach(userSessionMapper::deleteBatchIds);
|
||||
}
|
||||
return timeoutCount;
|
||||
return timeoutIdList.size();
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user