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<ActiveUser> list(String username) {
|
String currentSessionId = (String) SecurityUtils.getSubject().getSession().getId();
|
|
List<ActiveUser> list = new ArrayList<>();
|
Collection<Session> 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);
|
}
|
}
|