package cc.mrbird.febs.monitor.service.impl; import cc.mrbird.febs.common.utils.AddressUtil; import cc.mrbird.febs.common.utils.DateUtil; import cc.mrbird.febs.monitor.entity.ActiveUser; import cc.mrbird.febs.monitor.service.ISessionService; import cc.mrbird.febs.system.entity.User; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.support.DefaultSubjectContext; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @author MrBird */ @Service @RequiredArgsConstructor public class SessionServiceImpl implements ISessionService { private final SessionDAO sessionDAO; @Override public List list(String username) { String currentSessionId = (String) SecurityUtils.getSubject().getSession().getId(); List list = new ArrayList<>(); Collection sessions = sessionDAO.getActiveSessions(); for (Session session : sessions) { ActiveUser activeUser = new ActiveUser(); User user; SimplePrincipalCollection principalCollection; if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) == null) { continue; } else { principalCollection = (SimplePrincipalCollection) session .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); user = (User) principalCollection.getPrimaryPrincipal(); activeUser.setUsername(user.getUsername()); activeUser.setUserId(user.getUserId().toString()); } activeUser.setId((String) session.getId()); activeUser.setHost(session.getHost()); activeUser.setStartTimestamp(DateUtil.getDateFormat(session.getStartTimestamp(), DateUtil.FULL_TIME_SPLIT_PATTERN)); activeUser.setLastAccessTime(DateUtil.getDateFormat(session.getLastAccessTime(), DateUtil.FULL_TIME_SPLIT_PATTERN)); long timeout = session.getTimeout(); activeUser.setStatus(timeout == 0L ? "0" : "1"); String address = AddressUtil.getCityInfo(activeUser.getHost()); activeUser.setLocation(address); activeUser.setTimeout(timeout); if (StringUtils.equals(currentSessionId, activeUser.getId())) { activeUser.setCurrent(true); } if (StringUtils.isBlank(username) || StringUtils.equalsIgnoreCase(activeUser.getUsername(), username)) { list.add(activeUser); } } return list; } @Override public void forceLogout(String sessionId) { Session session = sessionDAO.readSession(sessionId); session.setTimeout(0); session.stop(); sessionDAO.delete(session); } }