您的位置:首页 > 其它

session监听器(可用于统计在线人数,了解系统当前的使用客户)

2010-05-20 10:11 661 查看
在系统运行中,有时候我们想了解下当前使用系统的用户,有多少人在使用系统?具体是哪些人在使用系统?

这时候,就可以通过session监听器(javax.servlet.http.HttpSessionAttributeListener
接口)的功能来实现。当用户登录系统的时候,通过特定的session属性记录下用户的登录情况。

整个过程可以分为以下4步:

第1步 准备session监听器处理类。

(如下面的SessionListener.java)

/*

* @(#)SessionListener.java	1.00	2009/02/20

* CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved.

*/

package com.stephen.filter;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpSessionAttributeListener;

import javax.servlet.http.HttpSessionBindingEvent;

/**

* session监听器. <br>

* 在WEB容器的web.xml中添加本监听器的调用,具体格式如下:(其中的"[" , "]"分别用"<" , ">"替换) <br>

*

* <pre>

*

*    [web-app]

*    [filter]

*    ...

*    [/filter]

*    [filter-mapping]

*    ...

*    [/filter-mapping]

*    ...

*    [listener][listener-class]com.stephen.filter.SessionListener[/listener-class][/listener]

*    ...

*    [servlet]

*    ...

*    [/servlet]

*    ...

*    [/web-app]

*

* </pre>

*

* 注意在web.xml中配置的位置. <br>

*

* @author stephen

* @version 1.00

* @see javax.servlet.http.HttpSessionAttributeListener

*/

public class SessionListener implements HttpSessionAttributeListener {

/**

* 定义监听的session属性名.

*/

public final static String LISTENER_NAME = "_login";

/**

* 定义存储客户登录session的集合.

*/

private static List sessions = new ArrayList();

/**

* 加入session时的监听方法.

*

* @param HttpSessionBindingEvent

*            session事件

*/

public void attributeAdded(HttpSessionBindingEvent sbe) {

if (LISTENER_NAME.equals(sbe.getName())) {

sessions.add(sbe.getValue());

}

}

/**

* session失效时的监听方法.

*

* @param HttpSessionBindingEvent

*            session事件

*/

public void attributeRemoved(HttpSessionBindingEvent sbe) {

if (LISTENER_NAME.equals(sbe.getName())) {

sessions.remove(sbe.getValue());

}

}

/**

* session覆盖时的监听方法.

*

* @param HttpSessionBindingEvent

*            session事件

*/

public void attributeReplaced(HttpSessionBindingEvent sbe) {

}

/**

* 返回客户登录session的集合.

*

* @return

*/

public static List getSessions() {

return sessions;

}

}


注意其中的_login就是设定的特殊session属性,当然你可以改成别的名字。

第2步 将session监听器配置到web.xml中.

(参
考如下的web.xml配置)

<?xml version="1.0" ?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<listener><listener-class>com.stephen.filter.SessionListener</listener-class></listener>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

</welcome-file-list>

</web-app>


上面的
<listener><listener-class>com.stephen.filter.SessionListener</listener-class></listener>
就是配置session监听器的。

在你的web.xml配置文件中添加上这一行就可以了(要注意添加的位置)。

第3步 当用户登录时监听用户。

当用户成功登录后执行下面的代码。

//记入session监听器

session.setAttribute(com.stephen.filter.SessionListener.LISTENER_NAME,new OnlineSession(request.getRemoteAddr(),userName,new Date().toString()));


注意在上面的代码中使用了新的OnlineSession类,OnlineSession类封装了登录用户的信息(如用户ip,用户名,登录时
间).

OnlineSession具体的内容如下:

/*

* @(#)OnlineSession.java	1.00	2009/02/20

* CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved.

*/

package com.stephen.filter;

/**

* 客户session信息.

*

* @author  stephen

* @version 1.0.0

*/

public final class OnlineSession {

/**

* 客户计算机的ip.

*/

private String ip = null;

/**

* 客户登录名.

*/

private String loginId = null;

/**

* 客户登录系统时间.

*/

private String onlineTime = null;

/**

* 构造器.

* @param ip

* @param loginId

* @param onlineTime

*/

public OnlineSession(String ip,String loginId,String onlineTime){

this.ip=ip;

this.loginId=loginId;

this.onlineTime=onlineTime;

}

/**

* @return Returns the ip.

*/

public String getIp() {

return ip;

}

/**

* @param ip The ip to set.

*/

public void setIp(String ip) {

this.ip = ip;

}

/**

* @return Returns the loginId.

*/

public String getLoginId() {

return loginId;

}

/**

* @param loginId The loginId to set.

*/

public void setLoginId(String loginId) {

this.loginId = loginId;

}

/**

* @return Returns the onlineTime.

*/

public String getOnlineTime() {

return onlineTime;

}

/**

* @param onlineTime The onlineTime to set.

*/

public void setOnlineTime(String onlineTime) {

this.onlineTime = onlineTime;

}

}


第4步 显示在线用户的情况。

可以直接通过 SessionListener.getSessions()方法来取得所有在线的用户。

<%@ page contentType="text/html;charset=UTF-8"%>

<%@ page import="java.util.List"%>

<%@ page import="java.util.Iterator"%>

<%@ page import="com.stephen.filter.SessionListener"%>

<%@ page import="com.stephen.filter.OnlineSession"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html><head><title>Online session Query</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head><body bgcolor="#e5ecf9" topmargin="5px" leftmargin="5px" rightmargin="5px">

<%

List sessions = SessionListener.getSessions();

String pageErrorInfo = null;

try{

%>

<h5>Online Employee</h5>

<table width="100%" align="center" cellspacing="1" cellpadding="4" border="0">

<tr id="listTitle">

<td>No.</td>

<td>登录Id</td>

<td>登录时间</td>

<td>ip</td>

</tr>

<%

StringBuffer datas = new StringBuffer();

if(sessions!=null){

OnlineSession onlineSession = null;

Iterator it = sessions.iterator();

int count=0;

while(it.hasNext()){

count++;

onlineSession=(OnlineSession)it.next();

datas.append("<tr><td>");

datas.append(count);

datas.append("</td><td>");

datas.append(onlineSession.getLoginId());

datas.append("</td><td>");

datas.append(onlineSession.getOnlineTime());

datas.append("</td><td>");

datas.append(onlineSession.getIp());

datas.append("</td></tr>");

}

}

out.print(datas.toString());

%>

</table>

<%

}catch(Exception e){

pageErrorInfo = e.toString();

}finally{

if(pageErrorInfo!=null){

%>

<font color="red">Error:<%=pageErrorInfo%></font>

<%

}

%>

</body></html>

<%

}

%>


最后的说明:

如果你的系统中有注销(或者退出登录)类似的功能(功能中调用了 session.invalidate()
方法),那么用户的信息就会自动从上面的列表中删除。如果没有使用注销功能,则只能等到session超时候才能从列表中自动删除。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐