posts - 14,  comments - 8,  trackbacks - 0
          轉自http://www.aygfsteel.com/flyffa/archive/2006/12/14/87722.html

          基本方法:

          基本的方法,網上到處都是,在 java 中就是在 web.xml 注冊一個 Listener ,如下:

          <listener>

              <listener-class>xp.web.SessionCounter</listener-class>

          </listener>

          SessionCounter.java 實現 javax.servlet.http.HttpSessionListener 接口,分別在 sessionCreated 方法和 sessionDestroyed 方法中處理 session 數目。

           

          這樣的方法有一定的問題:

          1 、對于真正從網頁訪問的和搜索引擎的 spider 無法區分。

          2 、當 Tomcat 重啟時,加載了上次持久化的 session 時,無法準確計算在線數。

           

          第二個問題我們可以不予考慮,這是 tomcat 容器實現不標準的問題,我們要解決的是的第一個問題,如何知道你的訪問的是真實的。

           

          js 繞過搜索引擎

          做過 pv 統計的都知道,可以用 script 的方式得到你真實的 pageView 數目,我們現在要做的就是這樣的一件事情,我們在所有的頁面都加入一段話:

          <script type="text/javascript">

          document.write ("<iframe src='/sessionCountServlet' width=0 height=0 frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=no></iframe>");

          </script>

          然后我們寫上一個 servlet 來記錄這些真正的訪問者。

          import java.io.*;

           

          import javax.servlet.*;

          import javax.servlet.http.*;

          public class SessionCounterServlet extends HttpServlet {

              public SessionCounterServlet() {

                  super();

              }

           

              public void doGet(HttpServletRequest request,

                                HttpServletResponse response) throws IOException,

                      ServletException {

           

                  process(request, response);

           

              }

           

              public void doPost(HttpServletRequest request,

                                 HttpServletResponse response) throws IOException,

                      ServletException {

           

                  process(request, response);

           

              }

           

              public void process(HttpServletRequest request,

                                  HttpServletResponse response) throws IOException,

                      ServletException {

                  SessionCounter.put(request.getSession().getId());

          }

          }

           

          我們可以看到這個 servlet 只是做了一件事情,在 process 里面做了 SessionCounter.put(request.getSession().getId()); 這個動作。

          我們來看看我們的 SessionCounter 做了些什么:

          import javax.servlet.http.*;

          import java.util.Hashtable;

           

          public class SessionCounter implements HttpSessionListener {

              public SessionCounter() {

              }

           

              public static Hashtable m_real = new Hashtable();

           

              private static long count = 0;

           

              public void sessionCreated(HttpSessionEvent e) {

                  count++;

              }

           

              public void sessionDestroyed(HttpSessionEvent e) {

                  if (count > 0) {

                      count--;

                  }

                  m_real.remove(e.getSession().getId());

              }

           

              public static long getSessionCount() {

                  return count;

              }

           

              public static void put(String sessionId){

                  m_real.put(sessionId,"1");

              }

           

              public static int getRealCount(){

                  return m_real.size();

              }

          }

          我們記錄了一個靜態的 hash 表來記錄激活狀態的 sessionid ,并在 session 銷毀的時候將這個 sessionid 置為空。

          怎么把 servlet 配置到 web 應用中我就不羅唆了。

          posted on 2008-04-21 11:37 虎嘯龍吟 閱讀(305) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊

          友情鏈接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 丽水市| 静海县| 盐山县| 鸡东县| 郧西县| 化隆| 巢湖市| 南投县| 井陉县| 林口县| 泰安市| 建德市| 巢湖市| 秦皇岛市| 都匀市| 邓州市| 金昌市| 湖南省| 伊春市| 托克逊县| 宜兰县| 巩留县| 中牟县| 侯马市| 安乡县| 平泉县| 淅川县| 巩留县| 巴彦县| 吴忠市| 翁牛特旗| 称多县| 澳门| 通州市| 鸡西市| 年辖:市辖区| 资中县| 加查县| 海安县| 海门市| 晋中市|