Web应用中统计在线用户

忽然想起要做个在线用户的功能

提供一个页面来监控所有在线用户,其实只要知道用户名、ip地址、登录时间即可 ,
当然,扩展后看到所有访问web应用的在线用户也可以(即没登录的也算)

在网上搜索了点资料 ,写了简单的例子,本地已经调试通过,还有待完善

列表 :
web.xml
onlineUser.jsp
OnlineUserListener.java implements HttpSessionListener
OnLineUsers.java implements HttpSessionBindingListener



1、如果只要简单的统计在线用户,直接使用 onlineUser.jsp 就可以
不过 不可以监控 session自动失效等情况
2、加入了OnlineUserListener.java(HttpSessionListener) 后,解决了 session失效的监控
这个需要在web.xml中注册
  <listener> 
<listener-class>OnlineUserListener</listener-class>
</listener>


3、OnLineUsers.java (HttpSessionBindingListener)
这个类是用来扩展的,实现 HttpSessionBindingListener,首先不需要在web.xml中注册 ,只需要在登录的时候 调用 session.setAttribute("xx", new OnLineUsers(userName)); 来绑定session ,可以考虑后续通过sessionid 来控制session


下面直接上代码了

onlineUser.jsp

<%@ page language="java" import="java.util.*,OnLineUsers"
pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

<%
String userName = request.getParameter("userName");
String type = request.getParameter("type");
String sessionUserName = (String) session.getAttribute("userName");
sessionUserName = (sessionUserName == null) ? "" : sessionUserName;
// 把用户名放入在线列表
List onlineUserList = (List) application.getAttribute("onlineUserList");
// 第一次使用前,需要初始化
if (onlineUserList == null)
{
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList", onlineUserList);
}

if (userName != null && "login".equals(type))
{

if (sessionUserName != null)
{
//先删除 之前的用户 ,再加入新登录的用户 ,这样可以保证不会重复增加
onlineUserList.remove(sessionUserName);
}
// 把用户名保存进session
session.setAttribute("userName", userName);

//如何控制 在一台机器登录两次 后 不会重复增加?
onlineUserList.add(userName);

response.sendRedirect("onlineUser.jsp");

//绑定session
session.setAttribute("xx", new OnLineUsers(userName));
}

//注销操作 ,一种是正常流程退出(页面上注销),还有一种是关闭浏览器、session自动失效的在Servlet中控制
if ("logout".equals(type))
{

// 销毁session
session.invalidate();
// 从在线列表中删除用户名

if (onlineUserList != null)
{
onlineUserList.remove(userName);
}

sessionUserName = "";

}
%>
</HEAD>

<BODY>
<h1>
在线用户Demo
</h1>

<h3>
当前用户:<%=sessionUserName%>
[
<a href="onlineUser.jsp?type=logout">注销</a>]
</h3>

<form action="onlineUser.jsp?type=login" method="post">
<input name="userName" value="userName" size="20" type="text">

<input name="passWord" value="passWord" size="20" type="password">
<input type="submit" value="登录">
</form>

<hr>
<h3>
在线用户列表
</h3>
<table>
<%
for (int i = 0; i < onlineUserList.size(); i++)
{
String onlineUsername = (String) onlineUserList.get(i);
%>
<tr>
<td><%=onlineUsername%></td>
</tr>
<%
}
%>
</table>


</BODY>
</HTML>



OnlineUserListener.java 需要在web.xml中注册


import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
* @author 版本 监听所有session的创建和销毁 ,需要在web.xml中注册
*/
public class OnlineUserListener implements HttpSessionListener
{
/**
* 新建session
*/
public void sessionCreated(HttpSessionEvent event)
{
System.out.println("新建session:" + event.getSession().getId());
}

/**
* 销毁 session ,如session失效,测试时候可以修改 web.xml 中 session-timeout
*/
public void sessionDestroyed(HttpSessionEvent event)
{
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 取得登录的用户名
String username = (String) session.getAttribute("userName");
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
if (onlineUserList != null)
{
onlineUserList.remove(username);
}
System.out.println(username + "已经退出!");
}
}





OnLineUsers ,扩展用的,这次基本没派上用场


import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
*
* 需要在登录时候调用 session.setAttribute("xx",new OnLineUsers(userName));
* 即可绑定,不需要在web.xml中注册
*
*
* 可以通过这个来 保存sessionid 和session的对应关系,供需要的时候使用
*
* @author
* @date 2013-1-5 上午09:06:06
*
* @version 1.0
*/
public class OnLineUsers implements HttpSessionBindingListener
{

String yhm;

public OnLineUsers(String yhm)
{
System.out.println("OnLineUsers...");
this.yhm = yhm;
}

public void valueBound(HttpSessionBindingEvent event)
{
System.out.println("OnLineUsers... valueBound");
HttpSession session = event.getSession();
ServletContext context = session.getServletContext();
HashMap<String, String> olu = (HashMap<String, String>) context.getAttribute("OnLineUsers");
if (olu == null)
{
olu = new HashMap<String, String>();
context.setAttribute("OnLineUsers", olu);
}
olu.put(yhm, session.getId());
}

public void valueUnbound(HttpSessionBindingEvent event)
{
System.out.println("OnLineUsers... valueUnbound");
HttpSession session = event.getSession();
ServletContext context = session.getServletContext();
HashMap<String, String> olu = (HashMap<String, String>) context.getAttribute("OnLineUsers");
if (olu != null)
{
olu.remove(yhm);
}
}

}


[img]http://dl.iteye.com/upload/attachment/0078/8622/613e3c96-45ac-3119-80a2-e5a22fbf1564.png[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值