忽然想起要做个在线用户的功能
提供一个页面来监控所有在线用户,其实只要知道用户名、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中注册
3、OnLineUsers.java (HttpSessionBindingListener)
这个类是用来扩展的,实现 HttpSessionBindingListener,首先不需要在web.xml中注册 ,只需要在登录的时候 调用 session.setAttribute("xx", new OnLineUsers(userName)); 来绑定session ,可以考虑后续通过sessionid 来控制session
下面直接上代码了
onlineUser.jsp
OnlineUserListener.java 需要在web.xml中注册
OnLineUsers ,扩展用的,这次基本没派上用场
[img]http://dl.iteye.com/upload/attachment/0078/8622/613e3c96-45ac-3119-80a2-e5a22fbf1564.png[/img]
提供一个页面来监控所有在线用户,其实只要知道用户名、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]