然后再配置监听,

web.xml配置:

1

2

com.test.OnlineUserListenerlistener-class>

3

listener>

一旦监听器发现调用了sessionDestoryed方法就会把其用户从在线人数中delete,在下面两种情况下会发生sessionDestoryed事件

a.执行session.invalidate()方法时

logout.jsp中调用了 session.invalidate()方法

b.session会话超时

session的默认超时事件是30分钟,30分钟后自动销毁session,这个时间也可以根据实际需要进行设置。

后来发现这种方式经常会出现数据丢失的情况,后来又发现通过实现HttpSessionBindingListener接口来实现,通过监听session的新建和销毁来控制也可以,具体方法如下:

HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。

新建类OnlineUserBindingListener,实现HttpSessionBindingListener接口,构造方法传入username参数,HttpSessionBindingListener内有两个方法valueBound(HttpSessionBindingEvent event)和valueUnbound(HttpSessionBindingEvent event),前者为数据绑定,后者为取消绑定

所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。

在login.jsp中做这一步:

01

02

03

04

05

request.setCharacterEncoding("UTF-8");

06

// 取得登录的用户名

07

String username = request.getParameter("username");

08

// 把用户名放入在线列表

09

session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));

10

// 成功

11

response.sendRedirect("result.jsp");

12

%>

这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。

从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。

正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。

HttpSessionBindingListener代码如下:

01

package com.test;

02

03

import java.util.ArrayList;

04

import java.util.List;

05

import javax.servlet.ServletContext;

06

import javax.servlet.http.HttpSession;

07

import javax.servlet.http.HttpSessionBindingEvent;

08

import javax.servlet.http.HttpSessionBindingListener;

09

10

public class OnlineUserBindingListenerimplements HttpSessionBindingListener {

11

String username;

12

13

public OnlineUserBindingListener(String username){

14

this.username=username;

15

}

16

public void valueBound(HttpSessionBindingEvent event) {

17

HttpSession session = event.getSession();

18

ServletContext application = session.getServletContext();

19

// 把用户名放入在线列表

20

List onlineUserList = (List) application.getAttribute("onlineUserList");

21

// 第一次使用前,需要初始化

22

if (onlineUserList ==null) {

23

onlineUserList =new ArrayList();

24

application.setAttribute("onlineUserList", onlineUserList);

25

}

26

onlineUserList.add(this.username);

27

}

28

29

public void valueUnbound(HttpSessionBindingEvent event) {

30

HttpSession session = event.getSession();

31

ServletContext application = session.getServletContext();

32

33

// 从在线列表中删除用户名

34

List onlineUserList = (List) application.getAttribute("onlineUserList");

35

onlineUserList.remove(this.username);

36

System.out.println(this.username +"退出。");

37

38

}

39

40

}

这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。

valueUnbound的触发条件是以下三种情况:

a.执行session.invalidate()时。

b.session超时,自动销毁时。

c.执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。

因此,只要不将listener从session中删除,就可以监听到session的销毁。

java统计在线人数_java实现在线人数统计相关推荐

  1. Asp.Net MVC3.0网站统计登录认证的在线人数

    前言 对于一个网站来说,统计在线人数是一个很重要的工作.平时也发现很多的网站论坛等都有在线人数的显示.对于一个网站如果在线人数很多,用户看到了这么个数字也是很了不起的事情.由于之前对于这个知识点只是知 ...

  2. java sleep方法_6种快速统计代码执行时间的方法,真香!(史上最全)

    我们在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Jav ...

  3. java中文章的阅读数统计

    java中文章的阅读数统计 1.直接操作数据库进行增加操作存在问题 存在问题:每次请求都要update数据库,如果访问量大了之后,数据库存在操作压力,此时怎么办? 解决方法:1.提高数据库性能(横向/ ...

  4. java通过Excel 模板导出复杂统计类excel文档,在ruoyi前后端分离框架中的应用

    Hello, 大家好! 我是不作死就不会死,智商不在线,但颜值超有品的拆家队大队长 --咖啡汪 一只不是在戏精,就是在戏精路上的极品二哈 前几天刚做了java通过Excel 模板导出复杂统计类exce ...

  5. JAVA毕设项目——新冠疫情统计系统

    今天给大家分享的是[新冠疫情统计系统]属于JAVA毕设的一小类,肯定有很多同学都不是该如何学或者从哪开始下手,不过今天就会和同学们来一起学习一下--新冠疫情统计系统!!! Java实战项目--新冠疫情 ...

  6. java highchart统计图_java+highchart实现分类下钻柱形图

    可视化展示中, 向下钻取的功能很常见. 这是有必要掌握的技能之一. 首先看官方示例. 第一层 点击第一个柱子向下钻取 实现这种图形展示, 关键点和难点在于数据格式的准备上. 通过查看示例代码, 可以看 ...

  7. java北京招聘_JAVA应届毕业生去北京找工作,薪资大约多少?

    据调查显示,世界上有大约900万的Java开发人员.在了解Java工程师薪资之前,我们得知道Java工程师成长路线,因为在不同的阶段我们所需要的技能水平是不一样的. 一般Java工程师是按照如下路径发 ...

  8. java接口防_java接口如何有效防止恶意请求

    解决方法: 1.在redis数据库db0中新建一个名为rd_sms_request_count表,表结构: Ip:客户请求的ip Success_count:成功次数 Failure_count:失败 ...

  9. java jstat 命令_Java命令-jstat

    作用 jstat 工具用于检测到的 Java 虚拟机 (JVM) 的性能统计信息,比如GC.内存大小.编译时间等. 命令格式 jstat [ generalOption | outputOptions ...

最新文章

  1. 了解Android Matrix转换
  2. KubeDL 0.4.0 - Kubernetes AI 模型版本管理与追踪
  3. go 怎么等待所有的协程完成_Go 编程:如何实现协程调度的精准控制
  4. crontab 执行php脚本,为什么crontab没有执行我的PHP脚本?
  5. Minikube-运行在笔记本上的Kubernetes集群
  6. 博图帮助乱码解决方法
  7. Charles安装SSL证书失败问题
  8. 2021年全球与中国飞机导航镜行业市场规模现状及企业市场份额分析
  9. PCB板材及叠层结构(转)
  10. 计算机教研组活动简讯,思中信息技术组教研活动简报
  11. Spring|Spring知识点总结思维导图
  12. 微型真空气体采样泵气路的流导计算
  13. PROCAST-重力铸造分析流程
  14. iphone php环境,苹果(Mac OS X 10.5.6)下搭建php开发环境
  15. iscroll.js
  16. CDH 6.3.1 集成Atlas
  17. semantic-ui semantic.json配置
  18. 安卓还是鸿蒙,SaaS应用移动化靠谁?
  19. css中style怎么用,css中style标签的使用方法
  20. 北斗导航卫星公开服务信号频率

热门文章

  1. OptaPlanner
  2. 关于keras.sum()和kears.softmax()等函数中维度的理解
  3. Azure中配置网络安全组入站规则让外部网络访问VM中的网站
  4. java 包含文件_java 文件夹拷贝(文件夹里包含文件和文件夹) 代码
  5. allergro音乐术语什么意思_常见音乐术语(速度术语)
  6. H5:使用video标签在页面中插入视频
  7. 成功者的13个良好习惯
  8. c#股票接口源代码算法
  9. Qt widget事件传递顺序以及监听特定控件是否接收某个事件
  10. redhat linux rsh设置