在线人数统计

笔者做了一个网站,需要统计在线人数。

在线有两种:

一、如果是后台系统如果登录算在线,退出的时候或者cookie、token失效的时候就算下线

二、如果是网站前台,访问的时候就算在线

今天我们来讲一下第2种情况,网站前台如何统计同时在线人数

1、首先创建一个在线人数管理类

该类主要是管理登录的session信息

package com.ds.blog.admin.manager;

import java.util.HashSet;
import java.util.Set; public class OnlineUserManager { //创建数据类型set来存储session
private static final Set<String> onlineUsers = new HashSet<>(); //添加访问
public static void addUser(String sessionId){
onlineUsers.add(sessionId);
} //删除访问
public static void removeUser(String sessionId){
onlineUsers.remove(sessionId);
} //获取在线人数
public static Set<String> getOnlineUsers(){
return onlineUsers;
} }

2、创建拦截器用于增加访问次数

当用户访问首页或者详情页的时候,拦截器获取sessionid,存入onlineUsers中

package com.ds.blog.admin.interceptor;

import com.ds.blog.admin.manager.OnlineUserManager;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class OnlineInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getRequestURI().contains("/front")){
System.out.println("pre begin");
// 保存访问人数
OnlineUserManager.addUser(request.getSession().getId());
System.out.println("pre end");
}
return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
if (request.getRequestURI().contains("/front")){
System.out.println("postHandle begin");
// 在处理完请求后调用,可以对ModelAndView进行操作
if (modelAndView != null) {
modelAndView.addObject("onlineUsers", OnlineUserManager.getOnlineUsers().size());
}
System.out.println("postHandle end");
}
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
} }

3、注册第2步的拦截器

package com.ds.core.config;

import com.ds.blog.admin.interceptor.OnlineInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration
public class MyMvcConfig implements WebMvcConfigurer { @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new OnlineInterceptor());
}
}

前三步做完以后,就可以实现在线人数了。

4、网页实现

<p th:text="'当前在线人数: ' + ${onlineUsers}"></p>

效果如下:

但是有一个问题,如果用户关闭访问的页面,同时在线人数不会下降,原因是因为前端认为关闭页面才算作退出在线人数。所以当页面关闭的时候,触发onlineUserManger的removeUser方法,就需要第5和第6步的实现

5、前端controller添加关闭页面时调用的controller

页面关闭时,会调用removeSession方法

/**
* @return
*/
@BookLog(title = "关闭页面时减少在线人数",businessType = BusinessType.DELETE)
@ApiOperation(value = "获取文章内容")
@PostMapping(value = "blog/updateOnlineUsers")
@ResponseBody
public Result removeSession(HttpServletRequest request){
try {
OnlineUserManager.removeUser(request.getSession().getId());
} catch (Exception exception) {
exception.printStackTrace();
}
return Result.success("减少成功");
}

6、页面关闭时,js触发controller

window.onbeforeunload = function() {
$.ajax({
url: 'blog/updateOnlineUsers',
method: 'POST',
success: function(response) {
console.log('关闭成功')
}
});
}

总体功能完成,我们来看下效果

ie浏览器登录,在线人数为1

谷歌浏览器登录,在线人数为2

关闭ie浏览器,刷新谷歌浏览器当前在线人数降为1

springboot在线人数统计的更多相关文章

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

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

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

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

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨 系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可 ...

  4. HttpsessionListener 实现在线人数统计

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

  5. 在线人数统计session管理

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

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

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

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

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

  8. Struts2实现简单的在线人数统计

    用Strust2框架的知识简单实现一个统计在线人数的问题. 1 搭建开发环境:(配置文件,jar包等问题) 2 index.jsp <%@ page language="java&qu ...

  9. servlet监听器实现在线人数统计

    一.准备知识 servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. filter:fi ...

  10. asp.net 在线人数统计\页面访问量

    1.新建网站,添加几个窗体.webForm1.aspx ,ViewStateForm.aspx 2.在网站的根目录下添加全局应用程序类“Global.aspx” .(重要) 3.在“Global.as ...

随机推荐

  1. React: React-Router嵌套路由 exact问题

    说明 当使用嵌套路由时,不能在父路由中添加exact,因为要先匹配父路由才能匹配子路由 父路由 子路由 效果如下所示 参考链接 https://www.jianshu.com/p/8bc3251079 ...

  2. PowerShell:因为在此系统上禁止运行脚本,解决方法

    解决方案 get-executionpolicy set-executionpolicy remotesigned 输入Y 至此问题解决

  3. failed (2: No such file or directory) in /var/www/QQ_Music/nginx.conf:18

    错误原因 解决方案 引入文件 /www/server/nginx/conf/mime.types;

  4. loader的三种配置方式

    在这篇 webpack处理css资源 文章中使用几个常用的loader 来编译 css 代码. 但其实 loader 的配置方式不止一种,一起来看看其它方式~ 在 webpack.config.js ...

  5. 微服务集成redis并通过redis实现排行榜的功能

    默认你已经看过我之前的教程了,并且拥有上个教程完成的项目, 之前的教程 https://www.cnblogs.com/leafstar/p/17638933.html 由于redis的安装网上教程很 ...

  6. QA|4个数据打开了4个页面,怎么实现只打开一个页面?单例模式|网页计算器自动化测试实战

    如下图,代码中4个数据,产生了4个页面,怎么实现只打开一个页面?可使用单例模式 查询得知 单例模式实现有5种方法,参照链接下: https://blog.csdn.net/SixStar_FL/art ...

  7. 《Python魔法大冒险》010 魔法宝箱:列表与元组的探险

    城堡的大门 随着小鱼和魔法师的深入,他们来到了一个古老的废弃城堡.城堡的大门上挂着一个巨大的锁,而锁的旁边有一排小抽屉,每个抽屉里都有一个物品. 魔法师对小鱼说:"这是一个古老的魔法宝箱,小 ...

  8. 银河麒麟使用kickstart二次打包制作安装镜像ISO

    系统:银河麒麟 V10 SP2 服务器:百信恒山 TS02F-F30 安装方式:服务器挂载ISO镜像进行安装 1.安装 mkisofs 软件包: #yum install genisoimage 2. ...

  9. 《Docker到Kubernetes容器运维实战》简介

    #好书推荐##好书奇遇季#<Docker到Kubernetes容器运维实战>已经出版.本书帮助读者系统掌握Docker与K8s运维技能.   本书内容 本书分两部分系统介绍Docker与K ...

  10. Kruskal重构树 学习笔记

    Kruskal 重构树 最大生成树将部分内容倒置即可 回顾:Kruskal 基本信息 求解最小生成树 时间复杂度:\(O(m \log m)\) 更适合稀疏图 算法思想 按照边权从小到大排序 依次枚举 ...