java web * 统计在线用户及人数
作者:甄情 发布时间:2023-12-14 14:42:52
在线用户使用HttpSessionListener * 统计
每当一个session会话建立 在线用户人数+1
每当一个session会话销毁 在线用户人数-1
使用ServletRequestListener * 统计用户信息
每当一个request建立 将当前用户放入集合
每当session会话销毁 将当前用户移出集合
我使用的是Servlet3.0 * 直接使用注解@webListener即可 不用在web.xml中布局
在web.xml中配置session-timeout标签 标志session过期时间为1分钟 0为不过期
<session-config>
<session-timeout>1</session-timeout>
</session-config>
servlet3.0使用条件
运行结果:
由于session对话关闭时间并不一定以设置的1分钟为准 所以 gif图像中最后等待时间较长
User 实体类
package com.scx.entity;
/**
* 用户实体类
*
*/
public class User {
//当前用户的session id
private String sessionId;
//当前用户的ip地址
private String ip;
//当前用户第一次访问的时间
private String firstTime;
public User() {
super();
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getFirstTime() {
return firstTime;
}
public void setFirstTime(String firstTime) {
this.firstTime = firstTime;
}
public String getSessionId() {
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
}
HttpSessionListener *
package com.scx.listener;
import java.util.ArrayList;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.scx.entity.User;
import com.scx.util.SessionUtil;
/**
* HttpSessionListener *
*
*/
@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
//当前用户数
private int userCounts=0;
@Override
public void sessionCreated(HttpSessionEvent se) {
//sessionCreated 用户数+1
userCounts++;
//重新在servletContext中保存userCounts
se.getSession().getServletContext().setAttribute("userCounts", userCounts);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//sessionDestroyed 用户数-1
userCounts--;
//重新在servletContext中保存userCounts
se.getSession().getServletContext().setAttribute("userCounts", userCounts);
@SuppressWarnings("unchecked")
ArrayList<User> userList=(ArrayList<User>) se.getSession().getServletContext().getAttribute("userList");
String sessionId=se.getSession().getId();
//如果当前用户在userList中 在session销毁时 将当前用户移出userList
if(SessionUtil.getUserBySessionId(userList, sessionId)!=null){
userList.remove(SessionUtil.getUserBySessionId(userList, sessionId));
}
//将userList集合 重新保存到servletContext
se.getSession().getServletContext().setAttribute("userList", userList);
}
}
ServletRequestListener *
package com.scx.listener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import com.scx.entity.User;
import com.scx.util.SessionUtil;
/**
* ServletRequestListener *
*
*/
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
//用户集合
private ArrayList<User> userList;
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
}
@SuppressWarnings("unchecked")
@Override
public void requestInitialized(ServletRequestEvent arg0) {
//从servletContext中获的userList
userList=(ArrayList<User>) arg0.getServletContext().getAttribute("userList");
//如果servletContext中没有userList对象 初始化userList
if(userList==null){
userList=new ArrayList<User>();
}
HttpServletRequest request=(HttpServletRequest) arg0.getServletRequest();
//sessionId
String sessionId=request.getSession().getId();
//如果当前sessionId不存在集合中 创建当前user对象
if(SessionUtil.getUserBySessionId(userList,sessionId)==null){
User user=new User();
user.setSessionId(sessionId);
user.setIp(request.getRemoteAddr());
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");
user.setFirstTime(sdf.format(new Date()));
userList.add(user);
}
//将userList集合 保存到ServletContext
arg0.getServletContext().setAttribute("userList", userList);
}
}
工具类
package com.scx.util;
import java.util.ArrayList;
import com.scx.entity.User;
public class SessionUtil {
//根据sessionId判断当前用户是否存在在集合中 如果存在 返回当前用户 否则返回null
public static User getUserBySessionId(ArrayList<User> userList,String sessionId) {
for (User user : userList) {
if(sessionId.equals(user.getSessionId())){
return user;
}
}
return null;
}
}
来源:http://blog.csdn.net/su20145104009/article/details/53217201


猜你喜欢
- 从远端服务器获取变更数据的主要模式有两种:推(push)和拉(pull)。Push 模式简单来说就是服务端主动将数据变更信息推送给客户端,这
- 双色球选号规则红球是1~33选6个,蓝球1~16选1个。它有17721088种排列组合,这个代码实现了如何将一组双色球号码 转换成第n个排列
- 最近在做项目的过程中 需要用JWT做登录和鉴权 查了很多资料 都不甚详细有的是需要在application.yml里进行jwt的配置 但我在
- 一、简介WorkManager 用于处理 Android 后台任务。我们只需要设置好任务内容、何时执行,剩下的工作就可以完全交给系统处理。它
- 一. Base64编码由来为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASC
- Map简介将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。此接口取代 Dictionary 类,后者完全是一个抽象
- 1:首先。创建一个springboot项目,这里我使用以及构建好基本框架的脚手架,打开是这个样子:Result类:已经封装好了三种返回类型的
- 本文实例为大家分享了Android实现3D层叠式卡片图片展示的具体代码,供大家参考,具体内容如下先看效果好了效果看了,感兴趣的往下看哦!整体
- spring batch简介spring batch是spring提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环
- 主要从以下十几个方面对Hibernate做总结,包括Hibernate的检索方式,Hibernate中对象的状态,Hibernate的3种检
- 本地异步处理,采用事件机制 可以使 代码解耦,更易读。事件机制实现模式是 观察者模式(或发布订阅模式),主要分为三部分:发布者、监听者、事件
- 本文实例为大家分享了AnAndroid图片无限轮播的具体代码,供大家参考,具体内容如下public class MainActivity e
- XSS是一种经常出现在web应用中的计算机安全漏洞,具体信息请自行Google。本文只分享在Spring Cloud Gateway中执行通
- EntityWrapper的in用法EntityWrapper<UserLife> wrapper = new EntityWr
- 目前只实现了java生成的固定的uuid:85bb94b8-fd4b-4e1c-8f49-3cedd49d8f28的序列化package m
- 什么是Dozer?Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通
- idea如何设置系统环境变量背景最近在接入阿里云的短信服务,在使用阿里云短信服务的SDK过程中想看看SDK中HttpUtil 中public
- ReadWriteLock 和 ReentrantReadWriteLock介绍ReadWriteLock,顾名思义,是读写锁。它维护了一对
- 先来简单说一下本文所要实现的功能:用户在浏览网页的时候,长按某一区域,识别如果是图片,则弹出弹框,出现保存图片的功能。同时识别图片是否是二维
- 项目背景:在项目中包含两个定时任务,配置信息如下:1、@Scheduled(initialDelay = 1,fixedDelay=1000