HttpSessionListener實現網站在線人數統計

         在網站中經常需要進行在線人數的統計。
        過去的一般做法是結合登錄和退出功能,即當用戶輸入用戶名密碼進行登錄的時候計數器加1,然後當用戶點擊退出按鈕退出系統的時候計數器減1。這種處理方式存在一些缺點,例如:用戶正常登錄後,可能會忘記點擊退出按鈕,而直接關閉瀏覽器,導致計數器減1的操作沒有及時執行;網站上還經常有一些內容是不需要登錄就可以訪問的,在這種情況下也無法使用上面的方法進行在線人數統計。
  我們可以利用Servlet規範中定義的事件監聽器(Listener)來解決這個問題,實現更準確的在線人數統計功能。對每一個正在訪問的用戶,J2EE應用服務器會爲其建立一個對應的HttpSession對象。當一個瀏覽器第一次訪問網站的時候,J2EE應用服務器會新建一個HttpSession對象,並觸發HttpSession創建事件,如果註冊了HttpSessionListener事件監聽器,則會調用HttpSessionListener事件監聽器的sessionCreated方法。相反,當這個瀏覽器訪問結束超時的時候,J2EE應用服務器會銷燬相應的HttpSession對象,觸發HttpSession銷燬事件,同時調用所註冊HttpSessionListener事件監聽器的sessionDestroyed方法。
  可見,對應於一個用戶訪問的開始和結束,相應的有sessionCreated方法和sessionDestroyed方法執行。這樣,我們只需要在HttpSessionListener實現類的sessionCreated方法中讓計數器加1,在sessionDestroyed方法中讓計數器減1,就輕鬆實現了網站在線人數的統計功能。
  下面就是利用HttpSessionListener實現在線人數統計的一個例子,親測通過。

首先,編寫一個簡單的計數器,代碼如下:OnlineCounter.java
package com.common.session;

public class OnlineCounter {
    private static long online = 0;    
    public static long getOnline() {
        return online;
     }    
    public static void raise(){
         online++;
     }
    public static void reduce(){
         online--;
    }
}

然後,編寫HttpSessionListener實現類,在這個實現類的sessionCreated方法中調用OnlineCounter的raise方法,在sessionDestroyed方法中調用OnlineCounter的reduce方法,代碼如下:MySessionListener.java
package com.common.session;

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

public class MySessionListener implements HttpSessionListener {

	public void sessionCreated(HttpSessionEvent event) { 
        
		OnlineCounter.raise();
	} 

	public void sessionDestroyed(HttpSessionEvent event) { 
		
		OnlineCounter.reduce();
	} 

}

以上兩個Java文件放到同一個包下。
再然後,把這個HttpSessionListener實現類,即MySessionListener.java,註冊到網站應用中,也就是在網站應用的web.xml中加入如下內容:

<web-app>

......

    <listener>
	<listener-class>
            com.common.session.MySessionListener
        </listener-class>
    </listener>

............
</web-app>
注意:web.xml中如果存在一個其他的
<listener>
..........
<pre name="code" class="html" style="font-weight: bold;"></listener>

不要管它,把中間這段代碼複製進去就行,都是相對獨立的部分。

這樣,基本功能已經實現。

在後臺 調用OnlineCounter.getOnline();這個方法就可以得到在線人數。
如若在前端顯示,問題就不復雜了,再次不一一贅述。
(望大家交流學習,批評指正,謝謝!)







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章