统计在线用户数量

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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值