监听当前在线用户的信息,通过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()};
用户的主机名:${info.getHostName()};
用户的sessionId:${info.getSessionId()};<br>
</c:forEach>
</body>
</html>