package com.landtool.lanbase.modules.sys.redis; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.Consumer; import javax.annotation.PostConstruct; import javax.annotation.Resource; import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.eis.MemorySessionDAO; import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.support.DefaultSubjectContext; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.landtool.lanbase.common.shiro.ShiroToken; import com.landtool.lanbase.common.utils.RedisUtils; import com.landtool.lanbase.common.utils.ShiroUtils; import com.landtool.lanbase.modules.log.entity.LogAction; import com.landtool.lanbase.modules.log.service.LogActionService; /** * redis人员在线 * @author zsx * */ @Component public class OnlineUserRedis { private static final String NAME = "onlineuser"; @Autowired private RedisUtils redisUtils; @Autowired private LogActionService logservice; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // /** // * 从session中获取记录的验证码 // */ // private Session getSessionByUsername(String username) { // DefaultWebSecurityManager securityManager=(DefaultWebSecurityManager) SecurityUtils.getSecurityManager(); // DefaultWebSessionManager sessionManager=(DefaultWebSessionManager) securityManager.getSessionManager(); // Collection sessions=sessionManager.getSessionDAO().getActiveSessions(); // Object attribute; // String user; // Session ses = null; // for(Session session:sessions){ // attribute=session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); // user=((SimplePrincipalCollection) attribute).toString(); // if(user.equals(username)){ // ses=session; // session.stop(); // break; // // } // } // return ses; // } // public void removeDownlineUser(){ if(redisUtils.exists(NAME)){ ConcurrentHashMap infos=redisUtils.get(NAME,ConcurrentHashMap.class ); Iterator it= infos.keySet().iterator(); while(it.hasNext()){ Object key= it.next(); String sessioninfo= (String) infos.get(key); JSONObject json=JSON.parseObject(sessioninfo); Double temp=json.getDouble("time"); //这里与用户最后一次操作时间进行判断 Map map=new HashMap<>(); map.put("UserName", json.getString("username")); map.put("appid", 1); map.put("lowerOffset", 0); map.put("limit", 1); List list= logservice.queryList(map); if(list!=null&!list.isEmpty()){ if((System.currentTimeMillis()-list.get(0).getDodate().getTime())>10*1000 && (System.currentTimeMillis()-temp)>10*1000 ){ infos.remove(key); } } } redisUtils.set(NAME, infos); } } public void saveOnlineUser(String username,Session session){ if(redisUtils.exists("onlineuser")){ ConcurrentHashMap infos=redisUtils.get("onlineuser",ConcurrentHashMap.class ); JSONObject json=new JSONObject(); List needtoremove=new ArrayList(); json.put("time", new Long(System.currentTimeMillis())); json.put("username",username); infos.forEach(new BiConsumer() { @Override public void accept(String t, Object u) { JSONObject json=JSONObject.parseObject(u.toString()); if(json.getString("username").equals(username)){ needtoremove.add(t); } } }); if(!needtoremove.isEmpty()){ needtoremove.forEach(new Consumer() { @Override public void accept(String t) { infos.remove(t); } }); } infos.put(session.getId().toString(), json.toJSONString()); redisUtils.set("onlineuser", infos); }else{ ConcurrentHashMap onlineuser=new ConcurrentHashMap(); JSONObject json=new JSONObject(); json.put("time", new Long(System.currentTimeMillis())); json.put("username",username); onlineuser.put(session.getId().toString(), json.toJSONString()); redisUtils.set("onlineuser", onlineuser); } } public void cleanLogoutUser(Session session){ if(redisUtils.exists("onlineuser")){ ConcurrentHashMap infos=redisUtils.get("onlineuser",ConcurrentHashMap.class ); infos.remove(session.getId().toString()); redisUtils.set("onlineuser", infos); } } }