利用session监听,统计在线人数

本文介绍了如何利用session监听来统计在线人数。由于HTTP协议的短链接特性,无法直接通过连接数来统计,因此通过session的数量可以间接估计。当用户访问服务器时,会创建session,若30分钟内无操作,session会被销毁。通过实现HttpSessionListener接口的自定义类,可以监听session的创建和销毁,从而动态更新在线人数。最后,配置web.xml映射路径以实现功能。

写在之前:
对于之前的登录验证,利用了session进行验证,确实是实现判断验证,但是,不知道为什么想要运行新建的.jsp文件时 还是默认显固定页面,修改url也不管用

解决方案——过滤器的.xml文件映射路径在搞鬼,过滤器的功能强大 但是得慎用。

正文:
由于session都在服务端,建立的连接数也可通过session个数来判断,再则HTTP协议是短链接的,所以无法在服务端根据建立了多少连接来统计当前有多少人在线。 因此可以通过统计session有多少来估计在线人数。

一旦一个用户访问服务器,就会创建一个session. 如果该用户持续访问,那么该session会持续有效。

如果经历了30分钟,该用户也没有做任何操作,就表示该用户“下线” 了,其对应的session也会被销毁。

所以可以通过统计有多少session被保留来估计当前在线人数。

编写统计在线人数的servlet:
自定义类——OnlineNumberListener
实现接口HttpSessionListener

当创建一个session的时候,就把数字+1,并且放在application里。

 servlet中application的定义:
ServletContext application = httpSessionEvent.getSession().getServletContext();

这就是jsp里的application在servlet和JSP文件里的application对象定义不一样,JSP可以直接调用 因为是隐式对象

注: 第一次从application里取数据的时候,是空的,要设置为0。

当销毁一个session的时候,把这个数字-1

package Listener;


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

public class OnlineSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        ServletContext application=httpSessionEvent.getSession().getServletContext();
        Integer Online_number=(Integer)application.getAttribute("Online_number");
        if(null==Online_number)
            Online_number=0;

        Online_number++;
        application.setAttribute("Online_number",Online_number);

        System.out.println("新增一位在线用户!");

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        ServletContext application =httpSessionEvent.getSession().getServletContext();
        Integer Online_number=(Integer)application.getAttribute("Online_number");//要转换为数字时 要默认用(Integer)强转
        if(null==Online_number)
        {
            Online_number=0;
        }
        else
            Online_number--;
        application.setAttribute("Online_number",Online_number);
        System.out.println("一位用户离线");
    }
}

配置相应的web.xml映射路径:

 <listener>
        <listener-class>Listener.OnlineSessionListener</listener-class>
    </listener>

新建.jsp文件验证:

<%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>

当前在线人数:${Online_number}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值