| package com.xcong.excoin.monitor.service.impl; | 
|   | 
| import com.xcong.excoin.common.utils.AddressUtil; | 
| import com.xcong.excoin.common.utils.DateUtil; | 
| import com.xcong.excoin.monitor.entity.ActiveUser; | 
| import com.xcong.excoin.monitor.service.ISessionService; | 
| import com.xcong.excoin.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); | 
|     } | 
| } |