使用监听器监听sessionId完成在线人数的显示

监听当前在线用户的信息,通过session是否存在来判断
1.监听session的创建动作
a.session创建后,获取到sessionID,判断该用户是不是已经在线
如果已经在线则不做处理,若不存在就讲信息保存到集合中,在更新到全局作用域中
b.session销毁后,拿到当前sessionID去集合中将数据删除,然后更新到全局作用域中
2.获取到当前需要添加到集合中的session信息
sessionid,hostName,ipAddress
将最新的数据更新到全局作用域中
3.在jsp页面中获取全局作用域中的集合,在页面遍历进行显示
(由于session的生命周期,浏览器关闭后session并不会立即销毁)

先创建实体类,用来保存获取到的相关数据

public class HostInfo {
    private String sessionId;//session的id
    private String hostName;//主机的名称
    private String ipAddress;//IP地址

    public String getSessionId() {
        return sessionId;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }

    public String getHostName() {
        return hostName;
    }

    public void setHostName(String hostName) {
        this.hostName = hostName;
    }

    public String getIpAddress() {
        return ipAddress;
    }

    public void setIpAddress(String ipAddress) {
        this.ipAddress = ipAddress;
    }
}

下面为Java代码

import javax.servlet.ServletContext;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.ArrayList;
import java.util.List;

public class SessionLinstener implements HttpSessionListener, ServletRequestListener {
    HttpServletRequest request;//获取request

    /**
     * 初始化动作的指定,代表了用户发送了请求
     * @param sre
     */
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        request=(HttpServletRequest) sre.getServletRequest();
    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        //获取session
        HttpSession session = se.getSession();
        //获取sessionID,用户的唯一标识
        String sessionId = session.getId();
        //先在全局作用域中获取原有的数据集合
        ServletContext context = session.getServletContext();
        List<HostInfo> infoList = (List<HostInfo>)context.getAttribute("infoList");
        //判断当前的session是否在集合中已存在
        if(infoList !=null){//不为空说明存在数据
            for(HostInfo info:infoList){//将数据遍历
                if(sessionId.equals(info.getSessionId())){
                    //如果当前用户的sessionId存在于集合中,说明当前用户已经在线
                    return;
                }
            }
        }else {
            //集合为空,说明还没有用户在线
            infoList=new ArrayList<>();//创建新的保存数据的集合
        }
        //获取IP地址
        String ipAddress = request.getRemoteAddr();

        //获取主机名称
        String hostName = request.getRemoteHost();
        //将数据添加到实体类hostinfo中
        HostInfo hostInfo = new HostInfo();
        hostInfo.setHostName(hostName);
        hostInfo.setIpAddress(ipAddress);
        hostInfo.setSessionId(sessionId);
        //将刚上线的用户数据添加到集合中
        infoList.add(hostInfo);
        //将数据保存到全局作用域中
        context.setAttribute("infoList",infoList);

    }

    /**
     * 会话关闭后(session并不会立即销毁)
     * 获取当前sessionid
     * 去集合中找到该sessionid对应的对象,从集合中移除数据
     * 更新数据到全局作用域中
     * @param se
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        //获取下线用户的sessionID
        String destorysessionId = session.getId();
        ServletContext servletContext = session.getServletContext();
        //获取全局作用域中的数据
        List<HostInfo> infoList = (List<HostInfo>)servletContext.getAttribute("infoList");
        //遍历取出想要的sessionid
        for(HostInfo info:infoList){
            if(destorysessionId.equals(info.getSessionId())){
                infoList.remove(info);//从集合中移除该用户的数据
                break;
            }
        }
        //更新全局作用域
        servletContext.setAttribute("infoList",infoList);
    }
}


在web.xml文件中需要配置监听



```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    <listener>
    <!--   填上监听的文件的位置     -->
        <listener-class>com.yunhe.listener.SessionLinstener</listener-class>
    </listener>
</web-app>
jsp页面展示的代码

```html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--使用jstl需要导相应的jar包--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<c:forEach items="${infoList}" var="info">
    用户的IP地址:${info.getIpAddress()};&nbsp;&nbsp;&nbsp;
    用户的主机名:${info.getHostName()};&nbsp;&nbsp;&nbsp;
    用户的sessionId:${info.getSessionId()};<br>
</c:forEach>
</body>
</html>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值