一、需求效果:

就是进入首页时能查看在线人数,没有特定要求,那我就不刷这个接口了

就进入首页加载一次

二、实现思路:

思路参考博客:

https://blog.csdn.net/GitLuckyd/article/details/124488063

如果是以前那种JSP的单体项目,可以用Servlet的监听器API来做

但是不管是Servlet还是现在微服务也好,没办法准确知道用户是否离开了应用

然后上面的思路是:

- 后台定时清空令牌容器

- 前端定时存入令牌,打一个时间差

- 只要存活的用户,不管是操作还是干嘛,只要没有关闭应用,就会持续存入令牌

三、代码实现:

后台接口直接做一个令牌容器

两个接口,一个查询容器令牌个数,一个存入令牌

package cn.ymcd.portal.user.controller;

import cn.ymcd.comm.log.LogFactory;
import cn.ymcd.comm.log.YmcdLogger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import java.util.HashSet;
import java.util.Set; /**
* @author OnCloud9
* @version 1.0
* @project portal-app
* @date 2023年10月10日 14:46
*/
@RestController
@RequestMapping("${api.path}/online")
public class UserOnlineCountController {
private YmcdLogger logger = LogFactory.getLogger(this.getClass());
private static final Set<String> TOKEN_SETS = new HashSet<>(); /**
* @author OnCloud9
* @date 2023/10/8 11:34
* @description 获取在线人员数量
* @params []
* @return java.lang.Integer
*/
@GetMapping("/counts")
public Integer getOnlineCounts() {
return TOKEN_SETS.size();
} /**
* @author OnCloud9
* @date 2023/10/10 14:51
* @description 心跳接口, 前端调用接口定时添加令牌 3分钟一次
* @params [token]
* @return void
*/
@GetMapping("/heart-beat")
public void heartBeatTokenSet(@RequestParam("token") String token) {
TOKEN_SETS.add(token);
} /**
* @author OnCloud9
* @date 2023/10/10 14:55
* @description 清除令牌 每30分钟执行一次
* @params []
* @return void
*/
@Scheduled(cron = "0 0/30 * * * ?")
public void scheduledTasks() {
logger.info("cn.ymcd.portal.user.controller.UserOnlineCountController 开始清理用户令牌... 当前令牌信息:" + TOKEN_SETS.toString());
TOKEN_SETS.clear();
}
}

  

前端API接口:

/**
* 获取用户在线人数
* @returns {*}
*/
export function getOnlineCounts() {
return requestPortal({
url: 'online/counts',
method: 'get'
})
} /**
* 用户在线人数心跳接口
* @returns {*}
*/
export function onlineHeartBeats(token) {
return requestPortal({
url: 'online/heart-beat',
method: 'get',
params: { token }
})
}

首页的定时任务:

import { mapGetters } from 'vuex'
import { getOnlineCounts, onlineHeartBeats } from '../api/user'
computed: {
... mapGetters([
'name',
'roles',
'dept',
'userId',
'token'
])
},
created() {
getOnlineCounts().then(res => (this.onlineCounts = res.data)) /* 每三分钟心跳一次,刷新这个页面加载一次 */
onlineHeartBeats(this.token)
this.heartbeatInterval = setInterval(() => (onlineHeartBeats(this.token)), 1000 * 60 * 3)
},
beforeDestroy() {
clearInterval(this.heartbeatInterval)
}

  

【Java】用户在线人数统计的简单实现的更多相关文章

  1. Java用户输入数值,做简单的猜数字游戏,导入基础的工具包util

    Java用户输入数值,做简单的猜数字游戏,导入基础的工具包util,导入包的方法为,import java.util.*: 完整的实例代码: /* 导入基础工具包 */ import java.uti ...

  2. 用HttpSessionListener与HttpSessionBindingListener实现在线人数统计

    在线人数统计方面的实现,最初我的想法是,管理session,如果session销毁了就减少,如果登陆用户了就新增一个,但是如果是用户非法退出,如:未注销,关闭浏览器等,这个用户的session是管理不 ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 系列目录 上次的探讨没有任何结果,我浏览了大量的文章 ...

  4. HttpsessionListener 实现在线人数统计

    最近在学servlet jsp,用的林信良先生的 jsp&servlet 这本书,在第五章有道在线人数统计的课后题完成,做一次记录. 实际效果: 一:用户类: package cc.openh ...

  5. Java静态检测工具/Java代码规范和质量检查简单介绍(转)

    静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...

  6. 在线人数统计session管理

    下午比较闲(其实今天都很闲),想了一下在线人数统计方面的实现,上网找了下这方面的知识,最初我的想法是,管理session,如果session销毁了就减少,如果登陆用户了就新增一个,但是如果是用户非法退 ...

  7. [转]用HttpSessionListener与HttpSessionBindingListener实现在线人数统计

    原文链接:http://www.cnblogs.com/shencheng/archive/2011/01/07/1930227.html 下午比较闲(其实今天都很闲),想了一下在线人数统计方面的实现 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(39)-在线人数统计探讨

    系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可以确实的统计在线用户! Discuz!NT 在线用户功能算是做得比较好的!参考资料 他的原理大致是根据用户的操作间隔来确 ...

  9. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  10. spring 第一篇(1-1):让java开发变得更简单(下)

    切面(aspects)应用 DI能够让你的软件组件间保持松耦合,而面向切面编程(AOP)能够让你捕获到在整个应用中可重用的组件功能.在软件系统中,AOP通常被定义为提升关注点分离的一个技术.系统由很多 ...

随机推荐

  1. 美团面试:说说Netty的零拷贝技术?

    零拷贝技术(Zero-Copy)是一个大家耳熟能详的技术名词了,它主要用于提升 IO(Input & Output)的传输性能. 那么问题来了,为什么零拷贝技术能提升 IO 性能? 1.零拷贝 ...

  2. Vue第三方库与插件实战手册

    title: Vue第三方库与插件实战手册 date: 2024/6/8 updated: 2024/6/8 excerpt: 这篇文章介绍了如何在Vue框架中实现数据的高效验证与处理,以及如何集成E ...

  3. nfs笔记整理

    NFS---共享存储系统 #network file system 网络文件系统 ​ #NFS主要使用在局域网下,让不同的主机之间可以共享文件.或者目录数据.主要用于linux系统上实现文件共享的一种 ...

  4. cuda性能优化-2.访存优化

    简介 在CUDA程序中, 访存优化个人认为是最重要的优化项. 往往kernel会卡在数据传输而不是计算上, 为了最大限度利用GPU的计算能力, 我们需要根据GPU硬件架构对kernel访存进行合理的编 ...

  5. VUE CLI中使用Jquery无法获取到dom节点

    mounted 类型:Function 详细: 实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了.如果根实例挂载到了一个文档内的元素上,当 mounted 被调用时 vm.$el 也在文 ...

  6. 【vue】利用输入框搜索过滤来选择列表

    方法1 <div id="app"> <input type="text" @input="handleInput()" ...

  7. BTC交易流程

    交易流程 比特币的交易流程涉及多个步骤和参与方,包括发送方.接收方.矿工和比特币网络中的节点.以下是比特币交易的详细流程: 创建交易: 生成比特币地址:比特币地址是一个由公钥生成的字符串,用于接收比特 ...

  8. P7086 题解

    考虑把每个字符串的前 \(k\) 位和后 \(k\) 位看成点,字符串看成边,那么一个字符串前缀后缀至少有一个是相似群体的前缀后缀,看成这条边的两个端点至少有一个被选中. 那么这就变成了一个最小点覆盖 ...

  9. 基于 tc 指令的网速限制工具

    前言 最近有一个需求,需要限制网卡速度进行一些测试.在朋友推荐下阅读了这篇文章 TC简单粗暴限制网速. 经过尝试,简单有效,整理成脚本放在正文,留作参考. 正文 指令解析(chatgpt 分析) 您提 ...

  10. MFC基于对画框工程笔记->更改窗口图标以及生成的.exe图标

    一.前言 继前一篇生成MFC基于对话框工程->新建MFC对话框后,开始改动对话框图标以及生成的.exe图标. 原对话框图标以及.exe图标: 在菜单栏中选择生成目录为Release 打开Rele ...