這幾天在做一個在線人數統計的程序,我費了好大勁在網上查了一些資料,經過調試學到了一些東西,在這寫兩個簡單的程序介紹一下:
1.新建一個工程OnlineCount,包結構如下圖所示:
demo1:新建一個OnlineCounter.java
代碼如下:
package com.dr.demo2.servlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.log4j.Logger;

public class OnlineCounter extends HttpServlet implements HttpSessionListener

{
private static Logger log = Logger.getLogger(OnlineCounter.class);
private static final long serialVersionUID = 1L;
private static int sessionCounter = 0;

public OnlineCounter()
{
log.info("OnlineCounter initialized.");
}

public void sessionCreated(HttpSessionEvent se)
{
sessionCounter++;
log.info("session created:" + sessionCounter);
}

public void sessionDestroyed(HttpSessionEvent se)
{
sessionCounter--;
log.info("session destroied");
}

public static int getOnlineSession()
{
return sessionCounter;
}

}


在web.xml中寫入以下語句:
<listener>
<listener-class>
com.dr.demo2.servlet.OnlineCounter
</listener-class>
</listener>

<session-config>
<session-timeout>1</session-timeout><!-- 默認時間為分鐘 -->
</session-config>


新建一個online.jsp,在body中寫入以下語句:
<%@ page import= "com.dr.demo2.servlet.OnlineCounter" %>
在線: <%= OnlineCounter.getOnlineSession() %>人
這樣就可以啟動服務器運行。
1.初始啟動服務器運行時:控制臺上會下面的日志信息:
2011-01-18 11:11:47,968 [main] [com.dr.demo2.servlet.OnlineCounter] [INFO] - OnlineCounter initialized.
2.在瀏覽器地址欄中中訪問online.jsp:控制臺上打出,
2011-01-18 11:37:16,031 [http-8080-1] [com.dr.demo2.servlet.OnlineCounter] [INFO] - session created:1
3.大約一分鐘過后,控制臺上會打出:
2011-01-18 11:39:10,265 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] [com.dr.demo2.servlet.OnlineCounter] [INFO] - session destroied
這跟在web.xml中的時間有關系
在調試時你會發現,當一個電腦上裝有不同的瀏覽器時,用另一個瀏覽器再次訪問時,會打出:
2011-01-18 11:38:16,031 [http-8080-1] [com.dr.demo2.servlet.OnlineCounter] [INFO] - session created:2
為了避免上述失誤產生,在程序中加入IP過濾:
demo2:新建一個SessionCounter.java
代碼如下:
package com.dr.demo2.servlet;

import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.log4j.Logger;


public class SessionCounter implements HttpSessionListener,ServletRequestListener
{
private static Logger log = Logger.getLogger(SessionCounter.class);
private static final String CONTENT_TYPE = "text/html; charset=GBK";
private static int activeSessions = 0;//當前活動的人數
private HttpServletRequest request;
private static ArrayList list = new ArrayList();//用來存放不同ip的地址


public void init() throws ServletException
{
log.info("SessionCounter init!");

}


public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
log.info("SessionCounter doGet!");
response.setContentType(CONTENT_TYPE);
HttpSession session = request.getSession();
}


public void destroy()
{
log.info("SessionCounter destroy!");
}


public void requestDestroyed(ServletRequestEvent event)
{
//To change body of implemented methods use File | Settings | File Templates.
log.info("SessionCounter requestDestroyed!");
}


public void requestInitialized(ServletRequestEvent sre)
{
request=(HttpServletRequest)sre.getServletRequest();
log.info("SessionCounter requestInitialized!");
}


public void sessionCreated(HttpSessionEvent httpSessionEvent)
{
log.info("SessionCounter sessionCreater!");
String sessionId = httpSessionEvent.getSession().getId();
Timestamp createTime = new Timestamp(System.currentTimeMillis());
String loginIp = request.getRemoteAddr();
boolean rs = true;

if(list.size() > 0)
{

for(int i = 0;i < list.size(); i ++)
{

if(loginIp.equals(list.get(i)))
{
rs = false;
}
}
}

if(rs)
{ //如果隊列中存在相同的IP 則SESSION不增加
list.add(loginIp);
log.info("ipList隊列新增ip: "+loginIp);
activeSessions++;
log.info("新增SESSION,sessionId = " + sessionId +"; createTime = " + createTime
+ "; loginIp = " + loginIp +"; 當前總SESSION值為 "+activeSessions);
}
}


public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
{
log.info("SessionCounter sessionDestroyed!");
String sessionId = httpSessionEvent.getSession().getId();
Timestamp overTime = new Timestamp(System.currentTimeMillis());
String loginIp = request.getRemoteAddr();

if(activeSessions>0)
{

if(list.size() > 0)
{

for(int i = 0;i < list.size(); i ++)
{

if(loginIp.equals(list.get(i)))
{
list.remove(i);
log.info("ipList隊列移除ip: "+loginIp);
}
}
}
activeSessions--; //在用戶銷毀的時候,從隊列中踢出這個IP
log.info("銷毀SESSION,sessionId = " + sessionId +"; overTime = " + overTime
+ "; loginIp = " + loginIp +"; 當前總SESSION值為 "+activeSessions);
}
}


public static int getActiveSessions()
{
log.info("SessionCounter getActiveSessions!");
return activeSessions;
}


public void setActiveSessions(int i)
{
log.info("SessionCounter setActiveSessions!");
activeSessions = i;
}

}


將xml中的代碼改為如下代碼:
<listener>
<listener-class>com.dr.demo2.servlet.SessionCounter</listener-class>
</listener>
<session-config>
<session-timeout>1</session-timeout><!-- 默認時間為分鐘 -->
</session-config>

online.jsp代碼改為如下代碼:
<%@ page import= "com.dr.demo2.servlet.SessionCounter" %>
在線: <%= SessionCounter.getActiveSessions() %>人
程序運行結果:
1.訪問online.jsp時,控制臺輸出如下:
2.用不同的瀏覽器訪問時,控制臺輸出如下:

3.用不同的電腦訪問時,控制臺輸出如下:
4.大概一分鐘過后,控制臺上輸出如下:

希望各位大蝦批評指正!