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

JavaWeb对于Listener的运用详解【利用Session统计在线人数】

文章目录

  • 一.监听器Listener
    • 1.1 Listener的作用
    • 1.2 小demo之统计在线人数
    • 1.3 统计结果错误原因分析

一.监听器Listener

1.1 Listener的作用

Listener是一个功能组件,在创建、销毁或添加、修改或删除应用程序、会话和请求对象的属性时自动执行代码。

监听器是servlet的监听器,它可以监听客户端的请求和服务器的操作。

可以使用application,session,request这三个对象

1.2 小demo之统计在线人数

1.新建omline,继承类HttpSessionListener,重写sessionCreated和sessionDestroyed方法:

public class omline implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent se) {

    }
    public void sessionDestroyed(HttpSessionEvent se) {
    }
}

2.对于sessionCreated方法:

创建Session监听,可以查看用户的一举一动。一旦创建Session就会触发这个方法!

对于sessionDestroyed方法:

销毁session监听。一旦销毁Session就会触发这个方法!

3.创建servletContext对象,新建OnlineCount键值对。

ServletContext servletContext = se.getSession().getServletContext();
Integer omlinecount = (Integer) servletContext.getAttribute("OnlineCount");

判断当前在线人数,如果omlinecount为空的话,更新当前的在线人数为1。

if(omlinecount==null){
    omlinecount=new Integer(1);
}

如果现在人数不为空的话,将当前的人数加一。

else{
    int count = omlinecount.intValue();
    omlinecount=new Integer(count+1);
}

将当前人数存入键值对:

servletContext.setAttribute("OnlineCount",omlinecount);

4.销毁session监听:

前面的代码基本一样,唯一不同的是,对于空值的判断和非空的人数计算。

对于当前对象为空时,将其赋值为0。

if(omlinecount==null){
    omlinecount=new Integer(0);
}

当其不为0时,将其人数减一:

else{
    int count = omlinecount.intValue();
    omlinecount=new Integer(count-1);
}

5.注册监听器,注册监听器只需要一句话,如下:

<listener>
    <listener-class>main.java.omline</listener-class>
</listener>

6.在访问的主页面写下jsp语句,引入java对象的值,实现输出当前的在线人数。

<h1>
    当前有<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%>人在线</span>
</h1>

7.启动服务器,访问主页,得到结果如下:

image-20220903105938658

1.3 统计结果错误原因分析

寻找原因,找到omline里的sessionCreated方法,写一下输出所有Session的ID

System.out.println(se.getSession().getId());

运行项目,观察输出台:

9DF74823455F36EDA429B31938B5EEE5
2D248509C732D5C448DA1E57BE539E97

打开F12,网络查看该用户的Session:

image-20220903121930476

可以看到,现在的Session是控制台输出的最后一个,说明第一个链接失败,已经被销毁了。

如果我们重新发布改页面:

image-20220903122045485

刷新改页面,继续打开Session观察如下:现在就变为了一人!

image-20220903122209909

注意:

如果我们使用一个游览器两个页面都访问该路径,还是属于一个任务的,在线人数算做一人。

如果我们打开不同的游览器来访问该url,这个这时候就会算做不同的用户,分配不同的Sessionid给用户。

步骤:

1.实现监听器的接口。重写里面的方法!

2.配置监听器(xml里注册监听器)。

相关文章:

  • Windows命令: net与sc的区别
  • 向量数据库是如何检索的?基于 Feder 的 HNSW 可视化实现
  • 架构师的 36 项修炼第11讲:致未来的架构师
  • 基于springboot+vue的商城系统(电商平台)
  • Linux CentOS 8(用户组的管理实验)
  • .net core开源商城系统源码,支持可视化布局小程序
  • ElasticSearch诞生
  • DRM系列(7)之drmModeAtomicCommit底层流程
  • R语言ggplot2可视化:使用ggpubr包的ggline函数可视化折线图(点线图、line plot)
  • PHP FTP 函数
  • PHP Filter 函数
  • 14---OpenCV:图像检测之边缘检测
  • 带救援的两阶段随机规划问题的LShaped算法理论与算例
  • 为什么比特币将持续增长
  • .Net CoreRabbitMQ消息存储可靠机制
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 2017-08-04 前端日报
  • avalon2.2的VM生成过程
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • k8s 面向应用开发者的基础命令
  • Odoo domain写法及运用
  • python 学习笔记 - Queue Pipes,进程间通讯
  • python学习笔记-类对象的信息
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 初识MongoDB分片
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端面试总结(at, md)
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 设计模式走一遍---观察者模式
  • 微信开放平台全网发布【失败】的几点排查方法
  • 消息队列系列二(IOT中消息队列的应用)
  • 小程序 setData 学问多
  • ​VRRP 虚拟路由冗余协议(华为)
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (06)金属布线——为半导体注入生命的连接
  • (BFS)hdoj2377-Bus Pass
  • (ros//EnvironmentVariables)ros环境变量
  • (二)换源+apt-get基础配置+搜狗拼音
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (一)SpringBoot3---尚硅谷总结
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .net core控制台应用程序初识
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET/C# 的字符串暂存池
  • .NET/C# 使窗口永不获得焦点
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net开发引用程序集提示没有强名称的解决办法
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • ?php echo ?,?php echo Hello world!;?
  • @AutoConfigurationPackage的使用
  • @RestController注解的使用
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛