移除超时的在线用户-完成

修改ruoyi-vue-pro.sql
新增表字段SysUserSessionDO.java#sessionTimeout
This commit is contained in:
Lyon
2021-03-07 15:41:28 +08:00
parent 92d3085b1f
commit 2cb7302d30
6 changed files with 119 additions and 74 deletions

View File

@ -10,6 +10,8 @@ import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 在线用户表
*
@ -44,5 +46,9 @@ public class SysUserSessionDO extends BaseDO {
* 浏览器 UA
*/
private String userAgent;
/**
* 会话超时时间
*/
private Date sessionTimeout;
}

View File

@ -8,6 +8,8 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@Mapper
public interface SysUserSessionMapper extends BaseMapperX<SysUserSessionDO> {
@ -18,4 +20,7 @@ public interface SysUserSessionMapper extends BaseMapperX<SysUserSessionDO> {
.likeIfPresent("user_ip", reqVO.getUserIp()));
}
default List<SysUserSessionDO> selectSessionTimeout() {
return selectList(new QueryWrapperX<SysUserSessionDO>().lt("session_timeout",new Date()));
}
}

View File

@ -1,9 +1,12 @@
package cn.iocoder.dashboard.modules.system.job.auth;
import cn.iocoder.dashboard.framework.quartz.core.handler.JobHandler;
import cn.iocoder.dashboard.modules.system.service.auth.SysUserSessionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 用户 Session 超时 Job
*
@ -13,10 +16,14 @@ import org.springframework.stereotype.Component;
@Slf4j
public class SysUserSessionTimeoutJob implements JobHandler {
@Resource
SysUserSessionService sysUserSessionService;
@Override
public String execute(String param) throws Exception {
// System.out.println("执行了一次任务");
log.info("[execute][执行任务:{}]", param);
log.info("[execute][执行任务:{}]", "清除过期用户信息");
long timeoutCount = sysUserSessionService.clearSessionTimeout();
log.info("[execute][执行任务:{}]", "清楚过期用户信息完成" + timeoutCount);
return null;
}

View File

@ -60,4 +60,12 @@ public interface SysUserSessionService {
*/
PageResult<SysUserSessionDO> getUserSessionPage(SysUserSessionPageReqVO reqVO);
/**
* 移除超时的在线用户
* @param
* @return {@link Long}
* @author Lyon
* @date 2021/3/7
**/
long clearSessionTimeout();
}

View File

@ -7,18 +7,21 @@ import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
import cn.iocoder.dashboard.framework.security.core.LoginUser;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
import cn.iocoder.dashboard.modules.system.dal.mysql.auth.SysUserSessionMapper;
import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO;
import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
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 org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import static cn.iocoder.dashboard.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER;
import static cn.iocoder.dashboard.util.collection.CollectionUtils.convertSet;
/**
@ -49,7 +52,9 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
loginUserRedisDAO.set(sessionId, loginUser);
// 写入 DB 中
SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
.userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).build();
.userId(loginUser.getId()).userIp(userIp).userAgent(userAgent)
.sessionTimeout(DateUtils.addTime(LOGIN_USER.getTimeout()))
.build();
userSessionMapper.insert(userSession);
// 返回 Session 编号
return sessionId;
@ -63,6 +68,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()));
userSessionMapper.updateById(updateObj);
}
@ -97,6 +103,18 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
return userSessionMapper.selectPage(reqVO, userIds);
}
@Override
public long clearSessionTimeout() {
Long timeoutCount = 0L;
List<SysUserSessionDO> sessionDOS = userSessionMapper.selectSessionTimeout();
for (SysUserSessionDO sessionDO : sessionDOS) {
if (loginUserRedisDAO.get(sessionDO.getId()) == null) {
timeoutCount += userSessionMapper.deleteById(sessionDO.getId());
}
}
return timeoutCount;
}
/**
* 生成 Session 编号,目前采用 UUID 算法
*