`
huttoncs
  • 浏览: 198972 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在线用户统计

    博客分类:
  • java
 
阅读更多
下面的代码是我在学习listener时从书中看到的,在这里把它贴出来和正在学习的同学分享一下

运行效果见图片。
1、运行结果中所收集的数据都是有Listener收集的,这里把所有的数据都存放在这个OnlineConstants类的静态常量中。OnlineConstants类的代码如下:
package ssh.constants;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;

public class OnlineConstants {
//索引所有的Session
public static Map<String, HttpSession> SESSION_MAP =
new HashMap<String, HttpSession>();

//当前登录的用户总数
public static int CURRENT_LOGIN_COUNT = 0;

//历史访问总数
public static int TOTAL_HISTORY_COUNT = 0;

//服务器启动时间
    public static Date START_DATE = new Date();
   
    //最高在线时间
    public static Date MAX_ONLINE_COUNT_DATE = new Date();
   
  //最高在线人数
public static int MAX_ONLINE__COUNT = 0;
}

2、在这个实例中一共使用了4种Listener:ServletContextListener、HttpSessionListener,HttpSessionAttributeListener、ServletRequestListener,各自的功能这里就不提了,直接贴代码了
package ssh.listeners.onlineStatistics;

import java.util.Date;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import ssh.constants.OnlineConstants;

public class MyContextListener implements ServletContextListener{

public void contextInitialized(ServletContextEvent event) {
// 服务器启动时调用
OnlineConstants.START_DATE = new Date(); //记录启动时间
}

public void contextDestroyed(ServletContextEvent event) {
// 服务器销毁时调用
OnlineConstants.START_DATE = null; //清空结果
OnlineConstants.MAX_ONLINE_COUNT_DATE = null;
}

}


package ssh.listeners.onlineStatistics;

import java.util.Date;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import ssh.constants.OnlineConstants;

public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{

    public void sessionCreated(HttpSessionEvent event) {
//创建Session 时被调用
HttpSession session = event.getSession(); //新创建的Session
OnlineConstants.SESSION_MAP.put(session.getId(), session);
//保存session
OnlineConstants.TOTAL_HISTORY_COUNT++; //总房访问人数++
OnlineConstants.CURRENT_LOGIN_COUNT++;
//如果当前在线人数超过历史记录,更新最大在线数
if (OnlineConstants.SESSION_MAP.size()>OnlineConstants.TOTAL_HISTORY_COUNT) {
OnlineConstants.MAX_ONLINE__COUNT = OnlineConstants.SESSION_MAP.size();
OnlineConstants.MAX_ONLINE_COUNT_DATE = new Date();
}
}

public void sessionDestroyed(HttpSessionEvent event) {
//销毁Session前被调用
HttpSession session = event.getSession(); //即将被销毁的session
OnlineConstants.SESSION_MAP.remove(session.getId());//移除session记录
OnlineConstants.MAX_ONLINE__COUNT--;

}

public void attributeAdded(HttpSessionBindingEvent event) {
// 添加session时调用
String name = event.getName(); //新建属性名
if (name.equals("seStudent")) { //登录
//当前登录数++
OnlineConstants.CURRENT_LOGIN_COUNT++;
OnlineConstants.MAX_ONLINE__COUNT++;
HttpSession session = event.getSession(); //添加到session

//查找该账号有没有在其他机器上登录
for (HttpSession sess:OnlineConstants.SESSION_MAP.values()) {
if (event.getValue().equals(sess.getAttribute("seStudent"))
&& session.getId()!=sess.getId()) {
sess.invalidate(); //使session失效
}
}
}
}

public void attributeRemoved(HttpSessionBindingEvent event) {
// 删除属性时调用
String name = event.getName(); //被删除的属性名
if (name.equals("seStudent")) {
OnlineConstants.CURRENT_LOGIN_COUNT--; //当前登录用户数--;
OnlineConstants.MAX_ONLINE__COUNT--;
}

}

public void attributeReplaced(HttpSessionBindingEvent event) {
// 修改属性时调用
String name = event.getName(); //被修改的属性名
if (name.equals("seStudent")) {
HttpSession session = event.getSession();
//重新登录的session
for (HttpSession sess:OnlineConstants.SESSION_MAP.values()) {
//如果新账号在其他机器上登录过,将以前的登录失效
if (event.getValue().equals(sess.getAttribute("seStudent"))
&& session.getId()!=sess.getId()) {
sess.invalidate(); //使session失效
}
}

}

}

}


package ssh.listeners.onlineStatistics;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class MyRequestListener implements ServletRequestListener{

public void requestDestroyed(ServletRequestEvent event) {
// TODO Auto-generated method stub

}

public void requestInitialized(ServletRequestEvent event) {
// 创建request时调用
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
HttpSession session = request.getSession(true); //获取对应的session
session.setAttribute("ip", request.getRemoteAddr()); //记录ip地址

String uri = request.getRequestURI(); //访问的URL
String[] suffix = {".html",".action",".jsp",".do"}; //指定后缀

for (int i = 0; i < suffix.length; i++) {
if (uri.endsWith(suffix[i])) {//如果是指定后缀
break;   //继续运行
}
if (i == suffix.length-1) {
return;   //否则返回
}
}

Integer activeTimes = (Integer) session.getAttribute("activeTimes");
if (activeTimes == null) {
activeTimes = 0;
}

session.setAttribute("activeTimes", activeTimes+1);
}


}


3、把上面3个Listener配置到web.xml中,代码如下:
<!-- 在线登录统计start -->
<listener>
<listener-class>
ssh.listeners.onlineStatistics.MyContextListener
</listener-class>
</listener>
<listener>
<listener-class>
ssh.listeners.onlineStatistics.MySessionListener
</listener-class>
</listener>
<listener>
<listener-class>
ssh.listeners.onlineStatistics.MyRequestListener
</listener-class>
</listener>
<!-- 在线登录统计end -->


4、这里使用jsp页面显示记录在OnlineConstants的数据,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="org.apache.poi.ss.usermodel.DataFormat"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="nt" tagdir="/WEB-INF/tags"%>
<jsp:directive.page   import="ssh.constants.OnlineConstants" />
<jsp:directive.page   import="java.util.Date" />
<jsp:directive.page   import="java.text.DateFormat" />
<jsp:directive.page   import="model.login.LoginVo" />

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>在线登录统计</title>
</head>

<body>
服务器启动时间:
<%=DateFormat.getDateInstance().format(OnlineConstants.START_DATE) %>,
累积共接待过 <%= OnlineConstants.TOTAL_HISTORY_COUNT %> 访客。<br />
同时在线人数最多为 <%=OnlineConstants.MAX_ONLINE__COUNT %> 人,
发生在 <%=DateFormat.getDateInstance().format(OnlineConstants.MAX_ONLINE_COUNT_DATE) %>。<br />

目前在线总数: <%=OnlineConstants.SESSION_MAP.size() %>,
登录用户: <%=OnlineConstants.CURRENT_LOGIN_COUNT %>。<br />

<table border="1">
<tr>
<th>jsessionid</th>
<th>account</th>
<th>creationTime</th>
<th>lastAccessedTime</th>
<th>new</th>
<th>activeTimes</th>
<th>ip</th>
</tr>
<%
for (String id:OnlineConstants.SESSION_MAP.keySet()){
HttpSession sess = OnlineConstants.SESSION_MAP.get(id);
LoginVo loginVo = (LoginVo)sess.getAttribute("seStudent");
%>
<tr <%= session == sess? "bgcolor=#DDDDDD":"" %>>
<td><%=id %></td>
<td><%=loginVo==null ? "&nbsp;":loginVo.getStuName() %></td>
<td><%=DateFormat.getDateInstance().format(sess.getCreationTime()) %></td>
<td><%=DateFormat.getDateInstance().format(sess.getLastAccessedTime()) %></td>
<td><%=sess.isNew() %></td>
<td><%=sess.getAttribute("activeTimes") %></td>
<td><%=sess.getAttribute("ip") %></td>
</tr>
<%
}
%>
</table>

</body>
</html>


5、工程启动后直接访问该jsp页面即可,不涉及到任何的逻辑处理,这也是使用Listener的好处
  • 大小: 36.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics