要实现在线人数统计功能,网上搜了下,都不太满意。于是自己综合了一下找到的资料方法,能实现在线人数比较准确的统计。
1.定义一个类OnlineUser
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
/**
*
* @lsls22
* 單例模式
*
*/
public class OnlineUsers {
private static final OnlineUsers onlineUsers = new OnlineUsers();
private static Map<HttpSession, String> userMap;
private OnlineUsers(){
userMap = new HashMap<HttpSession,String>();
}
public static OnlineUsers getInstance(){
return onlineUsers;
}
public static int getUserCount() {
return userMap.size();
}
public static Map<HttpSession, String> getUserMap() {
return userMap;
}
public static void setUserMap(Map<HttpSession, String> userMap) {
OnlineUsers.userMap = userMap;
}
public static OnlineUsers getOnlineusers() {
return onlineUsers;
}
}
2.用户类实现HttpSessionBindingListener接口,新用户登录时生成一个User对象,此时触发valueBound方法
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener{
private String userId;
private String userName;
public String getUserId() {
return userId;
}
public String getUserName() {
return userName;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
/**
* 用戶登錄后會創建一個新User對象,將它放進OnlineUsers
*/
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
HttpSession session = arg0.getSession();
OnlineUsers.getUserMap().put(session,userId);
}
/**
* 當銷毀一個User對象時,將它從OnlineUsers移除
*/
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
OnlineUsers.getUserMap().remove(arg0.getSession());
}
}
;3.jsp页面
<
%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Online User</title>
<script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
<script language="javascript" type="text/javascript">
$(function(){;
refreshOnlineUser();
});
//每三秒钟刷新一次在线人数
function refreshOnlineUser(){
$.ajax({
type:'post',
url:'refresh_onlne_user',
success:function(data){
$('#lbUserCount').attr('innerHTML',data);
},
error:function(data,status){
$.messager.alert('Error',data,'err');
},
dataType:'text'
});
setTimeout("refreshOnlineUser()",3000);
}
</script>
</head>
<body >
<div>在线人数:<label id="lbUserCount"></label></div>
</div>
</body>
</html>
4.请求的Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
for(HttpSession se : OnlineUsers.getUserMap().keySet()){
if(new Date().getTime() - se.getLastAccessedTime() > 6000){
OnlineUsers.getUserMap().remove(se);
}
}
Integer count = OnlineUsers.getUserCount();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.getWriter().write(count.toString());
}