当前位置: 首页 > news >正文

Springboot 用session监听器统计在线用户数量

今天给大家分享这个吧。

利用Springboot中的session监听器去实现统计在线用户数量的需求(当然其实用shiro或者security是框架自己带有会话管理的,用起来更加方便)。

但是, 接下来这个是非常简单直接快速的实现这个需求,不废话了

上代码:

第一步  . 既然用监听器实现,那肯定得创建监听器了。 

创建SessionListener.class

我用的是最直接的注解方式,图方便。   

这边的关键是两点,①@WebListener  ②implements HttpSessionListener

其他的思路看代码就能看懂,而且也做了注释。

import javax.servlet.annotation.WebListener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


/**
 * @Author : JCccc
 * @CreateTime : 2018-11-15
 * @Description :
 * @Point: Keep a good mood
 **/

@WebListener
public class SessionListener implements HttpSessionListener{

    private int onlineCount = 0;//记录session的数量

    /**
     * session创建后执行
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        onlineCount++;
        System.out.println("【HttpSessionListener监听器】 sessionCreated, onlineCount:" + onlineCount);
       //将最新的onlineCount值存起来
        se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);

    }

    /**
     * session失效后执行
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        if (onlineCount > 0) {
            onlineCount--;
        }
        System.out.println("【HttpSessionListener监听器】 sessionDestroyed, onlineCount:" + onlineCount);
        //将最新的onlineCount值存起来
        se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
    }

}

第二步. 好了其实已经完成了。

 

接下来就是单纯的校验:

首先模拟一个系统的登录接口,

@GetMapping("/login")
 public String login(HttpSession session){
    //模拟一个用户调用了登录接口,进入系统
    return "用户登录";
}

然后在浏览器访问一下,假装登录:

这时候,你可以看到控制台输出了:

是的,已经统计到一个了。

然后你可以继续用浏览器访问,你会发现控制台不会继续输出,因为你的ip对应的这个session还没过期,这就避免了重复统计。

然后,你把你的这个/login丢给你身边的小伙伴测试下,你就会发现控制台又输出了,而且 onlineCount变成2了。

 

最后,再写个获取这个统计值 onlineCount吧:

 

@GetMapping("/getOnlineCount")
public String getOnlineCount(HttpServletRequest httpServletRequest){
    HttpSession  session = httpServletRequest.getSession();
    //将session监听器的统计在线人数给拿出来~
    Object onlineCount=session.getServletContext().getAttribute("onlineCount");
    //展示一下,看看
    return "onlineCount : "+onlineCount;
}

 

再贴一个图,session过期了就会这样~

 

 

好了,就到此吧,顺便一提,在监听器那边是可以每次统计之后,不止set进session里面,还可以存数据库。

 

 

 

相关文章:

  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • JAVA 责任链设计模式
  • JAVA回调函数简单讲解 CallBack
  • JAVA HttpClient 远程调用接口doGet、doPost工具类
  • JAVA 接口签名sign生成 工具类
  • mybatis-config配置文件各项简单介绍
  • Springboot整合Mybatis增删查改、连接MYSQL数据库及配置druid连接池
  • JAVA 模板设计模式
  • Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入
  • Springboot中使用GSON报错 An attempt was made to call the method com.google.gson.GsonBuilder.setLenient
  • IDEA @AutoWired注入bean 出现红色波浪线
  • JAVA 最常用实用的正则表达式校验
  • Springboot 整合WebFlux 实现RESTFUI风格API 及简单的CRUD
  • Springboot 读取配置文件application.properties (yml)的四种方式
  • Springboot 指定获取自己写的配置properties文件的值
  • 网络传输文件的问题
  • exports和module.exports
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript 基础知识 - 入门篇(一)
  • Xmanager 远程桌面 CentOS 7
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 飞驰在Mesos的涡轮引擎上
  • 前端设计模式
  • 使用Gradle第一次构建Java程序
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 06-01 点餐小程序前台界面搭建
  • 说说我为什么看好Spring Cloud Alibaba
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # 安徽锐锋科技IDMS系统简介
  • $.proxy和$.extend
  • ()、[]、{}、(())、[[]]命令替换
  • (规划)24届春招和25届暑假实习路线准备规划
  • (接口自动化)Python3操作MySQL数据库
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • ******之网络***——物理***
  • .Net 4.0并行库实用性演练
  • .Net 6.0 处理跨域的方式
  • .net core 6 redis操作类
  • .NET MVC 验证码
  • @GlobalLock注解作用与原理解析
  • @property括号内属性讲解
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [ C++ ] STL_list 使用及其模拟实现
  • [Bada开发]初步入口函数介绍
  • [C#][DevPress]事件委托的使用
  • [Contest20180313]灵大会议
  • [CTSC2014]企鹅QQ
  • [Django 0-1] Core.Checks 模块
  • [FFmpeg学习]从视频中获取图片
  • [Google Guava] 2.1-不可变集合