1. 程式人生 > >session監聽器(可用於統計線上人數,當前客戶)

session監聽器(可用於統計線上人數,當前客戶)

在系統執行中,有時候我們想了解下當前使用系統的使用者,有多少人在使用系統?具體是哪些人在使用系統?

這時候,就可以通過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>

上面的 com.stephen.filter.SessionListener 就是配置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超時候才能從列表中自動刪除。