首页 > 其他分享 >springboot在线人数统计

springboot在线人数统计

时间:2023-11-18 23:56:57浏览次数:29  
标签:springboot servlet request import 人数 public 在线

在线人数统计

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

在线有两种:

一、如果是后台系统如果登录算在线,退出的时候或者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>

效果如下:
image

但是有一个问题,如果用户关闭访问的页面,同时在线人数不会下降,原因是因为前端认为关闭页面才算作退出在线人数。所以当页面关闭的时候,触发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

image

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

image

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

image

标签:springboot,servlet,request,import,人数,public,在线
From: https://www.cnblogs.com/dalaba/p/17841496.html

相关文章

  • axios向后台springboot服务器发送请求时出现的错误
    this.$axios.post("http://localhost:8080/changeExamStatus?billID="+this.tableData[index].billID).then((response)=>{if(response.data.code==1){alert("第"+(index+1)+"项申请单审核成功");}......
  • springboot引入本地jar包
    1.在resources目录下新建lib目录,将jar放入2.在pom文件中添加依赖<dependency><groupId>com.fanruan</groupId><artifactId>fine-accumulator</artifactId><version>11.0</version><scope>system</scope><......
  • C:\Users\17482\Desktop\ERP——test1\SpringBoot-ERP-master\src\main\java
    这个错误表明在你的Java类文件UserImp.java中,找不到MyBatis的注解包org.apache.ibatis.annotations。这个包中包含了MyBatis的注解,比如@Select、@Insert等。首先,请确保你的项目正确引入了MyBatis的依赖。在你的pom.xml文件中应该包含类似以下的依赖配置:<dependency......
  • 基于智能数采网关的商铺能耗在线监测方案
    用电成本是各种经济活动成本的重要部分,例如在最常见的零售商铺场景中,由于店铺内用电设备繁多、用电功率大小不一、使用时长和频次也不相同,不仅对于用电设备管理复杂,而且也时常存在隐性的能耗浪费问题,日积月累下来积聚为一大笔额外的能源支出,间接缩减了经营利润。 针对零售商铺......
  • springboot 集成jwt 登录 拦截器获取token 解析token放入holder中
    一、依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>......
  • PageOfficeV6.0在线打开excel文件给单元格填充数据
    转载:单元格填充数据单元格填充数据注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。PageOffice提供了Workbook对象来实现对Excel文件的数据填充功能,如果只是简单的填充一下数据,那么通过调用Sheet对象的openCell......
  • springboot 热部署
    加载插件<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</......
  • springboot学习日记(五)
    今天先安装试用了下postman,get获取自己的网页,返回是网页源码。这里贴一下前几天测试的开源新手项目IncrediableKJ/Student-management-system:基于springboot+mybatis+thymeleaf的学生信息管理系统,适合springboot初学者的练手项目(github.com)然后发现添加学生列表失败,看了......
  • SpringBoot使用@Value获取不到值的问题
    背景在一次SpringBoot项目改造为Cloud的过程中,使用Nacos作为配置中心获取属性,改造后程序启动报错,查看日志,定位到代码:解决方案如果了解Bean的生命周期的同学应该知道,Spring在创建Bean的时候,会使用无参构造函数去初始化一个Bean,@Value这个阶段是属于依赖注入,是在初始化之后的,所......
  • 02_自定义Springboot starter
     创建springbootstarter 创建一个demostarter  创建配置类@Configuration@EnableConfigurationProperties(EmailProperties.class)@ConditionalOnBean(EmailEnable.class)publicclassEmailAutoConfiguration{static{System.out.println("Em......