主要功能:统计当前连接客服端的数目以及客服端的信息
实现方法:使用了两个监听器,一个request用户请求的监听,用于获取用户的信息,一个HttpSession监听,则统计用户的数量
request监听器代码如下:
package Litener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import Idea.Judge;
import user.UserInformation;
//从request中获取用户的信息并保存到Servletcontext对象中
@WebListener
public class RequestListener implements ServletRequestListener {
//创建user集合,保存当前连接的用户信息
List<UserInformation> userlist= new ArrayList<UserInformation>();
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("requestDestroyed执行完毕");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
Judge j= new Judge();
//当客服端发送请求时,记录下客服端的信息
HttpServletRequest request = (HttpServletRequest)arg0.getServletRequest();
//获取到用户的地址
String ip= request.getRemoteAddr();
//获取用户的SessionId
String SessionId=request.getSession().getId();
//将获取到的客服端信息保存到userInformation对象中,先判断集合中是否已经存在该客服端对象
if( j.judge( userlist,SessionId) ==null ){
UserInformation user= new UserInformation();
user.setIp(ip);
user.setSessionId(SessionId);
user.setUsername(new SimpleDateFormat("yyyy年MM月dd日 HH:mm分ss秒").format(new Date()));
//添加到集合userlist中
userlist.add(user);
}
//保存到ServletContext对象中
request.getSession().getServletContext().setAttribute("userlist", userlist);
System.out.println("保存完毕");
}
HttpSession监听器代码如下:
package Litener;
import java.util.List;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import user.UserInformation;
import Idea.Judge;
@WebListener
//用于统计用户的数目
public class SessionListener implements HttpSessionListener {
private int number=0;
Judge j= new Judge();
@Override
public void sessionCreated(HttpSessionEvent arg0) {
//当会话创建时数目++,并保存到web项目对象Servletcontext中
number++;
arg0.getSession().getServletContext().setAttribute("number", number);
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
number--;
arg0.getSession().getServletContext().setAttribute("number", number);
//获取一下request对象
List<UserInformation> userlist = ( List<UserInformation>)arg0.getSession().getServletContext().getAttribute("userlist");
String SessionId=arg0.getSession().getId();
//当会话结束的时候则删去该客服端,而不是在客服端请求结束的时候
//先判断是否存在该客服端集合在userlist集合中
if( j.judge(userlist,SessionId)!=null){
UserInformation user= j.judge(userlist,SessionId);
//删除客服端
userlist.remove(user);
}
arg0.getSession().getServletContext().setAttribute("userlist", userlist);
}
}
一个UserInformation类,用于保存用户的信息,代码如下:
package user;
import java.util.Date;
public class UserInformation {
private String ip;
private String SessionId;
private String date ;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getSessionId() {
return SessionId;
}
public void setSessionId(String sessionId) {
SessionId = sessionId;
}
public String getDate() {
return date;
}
public void setUsername( String date) {
this.date = date;
}
}
judge类,有一个判断的方法,判断在客服端对象的集合Userlist中是否已经包含了该用户,代码如下:
package Idea;
import java.util.List;
import user.UserInformation;
public class Judge {
public UserInformation judge(List<UserInformation> userlList ,String SessionId){
//如果list集合不为空,则进行遍历
if(userlList!=null){
for(UserInformation user : userlList){
if(user.getSessionId().equals(SessionId)){
return user;
}
}
}
return null;
}
}
最后为显示页面,显示连接的客服端数量以及信息,核心代码如下:
<body>
<h1>统计当前的用户数目并输出客服端的详细信息</h1>
用户的数目为:<%=request.getServletContext().getAttribute("number")%><br>
${username}
<%
//for循环打印用户的信息
List<UserInformation> userlist=( List<UserInformation>)request.getSession().getServletContext().getAttribute("userlist");
if(userlist!=null){
for(UserInformation user:userlist){
%>
ip地址为:<%=user.getIp() %><br>
SessionId为:<%=user.getSessionId() %><br>
用户连接的时间为:<%=user.getDate() %><br>
<%} }%>
</body>