1.UserOnlineCount.java
@Getter
@Setter
@ToString
public class UserOnlineCount {
//角色ID
private Long roleId;
//角色名称
private String roleName;
//用户ID
private Long userId;
//用户会话ID
private String sessionId;
public UserOnlineCount(Long roleId,String roleName,Long userId,String sessionId){
this.roleId=roleId;
this.roleName=roleName;
this.userId=userId;
this.sessionId=sessionId;
}
}
2.统计在线用户数量(UserOnlineListener.java)
public class UserOnlineListener implements HttpSessionBindingListener {
private UserOnlineCount userOnlineCount;
public UserOnlineListener(UserOnlineCount userOnlineCount){
this.userOnlineCount=userOnlineCount;
}
//注:HttpSessionBindingListener必须实例化后放入某一个session中才可以进行监听
@Override
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session=event.getSession();
ServletContext application=session.getServletContext();
//从application获取当前登录用户列表
List<UserOnlineCount> userOnlineList= (List<UserOnlineCount>)
application.getAttribute("userOnlineList");
//第一次使用前,需要实例化userOnlineList
if(userOnlineList==null){
userOnlineList=new ArrayList<>();
application.setAttribute("userOnlineList",userOnlineList);
}
//对于没角色用户则对角色name进行赋值
if(userOnlineCount.getRoleName()==null){
userOnlineCount.setRoleName("无角色用户");
}
//将当前用户添加至用户列表
userOnlineList.add(this.userOnlineCount);
//System.out.println("session属性绑定=======>"+this.userOnlineCount);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session=event.getSession();
ServletContext application=session.getServletContext();
//从application获取当前登录用户列表
List<Long> userOnlineList= (List<Long>)
application.getAttribute("userOnlineList");
//将该用户从列表中移除
userOnlineList.remove(this.userOnlineCount);
//System.out.println("session属性解除绑定=======>"+this.userOnlineCount);
}
}
3.查询所有角色下的在线用户数量
public Map<String, Long> getUserOnline(HttpServletRequest request) {
HttpSession session=request.getSession();
ServletContext application=session.getServletContext();
List<UserOnlineCount> userOnlineList= (List<UserOnlineCount>)
application.getAttribute("userOnlineList");
Map<String, Long> onlineCount=new HashMap<>();
if(userOnlineList!=null){
//根据用户角色统计在线用户数量
onlineCount=userOnlineList.stream()
.collect(Collectors.groupingBy(UserOnlineCount::getRoleName,Collectors.counting()));
//System.out.println("在线用户数:"+onlineConnt);
}
//查询所有角色,根据key将所有角色与在线用户map合并
Iterable<RoleNode> allRole= roleRepository.findAll();
//遍历allRole
for(RoleNode role:allRole){
//如果onlineCount中已经包含在线用户,则继续
if(onlineCount.containsKey(role.getRoleName())){
continue;
}else{
//如果某一角色不在onlineCount中,说明该角色中没有用户在线,则将该角色放入onlineCount
//中并赋值0
onlineCount.put(role.getRoleName(),0L);
}
}
return onlineCount;
}