session監聽器(可用於統計線上人數,當前客戶)
阿新 • • 發佈:2018-12-31
在系統執行中,有時候我們想了解下當前使用系統的使用者,有多少人在使用系統?具體是哪些人在使用系統?
這時候,就可以通過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超時候才能從列表中自動刪除。