應用,一定要應用

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            25 Posts :: 0 Stories :: 118 Comments :: 0 Trackbacks

          基本方法:

          基本的方法,網上到處都是,在 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 2006-12-14 15:10 flyffa 閱讀(2405) 評論(1)  編輯  收藏 所屬分類: 其他應用

          Feedback

          # re: 得到準確的在線人數統計-減少搜索引擎的干擾 2006-12-14 16:25 loocky
          用listener來監聽,每次用ie訪問就觸發servlet,listener也就監聽到,方法不錯。
            回復  更多評論
            

          主站蜘蛛池模板: 田林县| 岳阳市| 民权县| 珠海市| 成都市| 洪泽县| 涪陵区| 获嘉县| 海南省| 鹤岗市| 洪雅县| 铁岭县| 吉安县| 八宿县| 永康市| 麻阳| 海淀区| 澎湖县| 鞍山市| 保靖县| 阿克| 京山县| 清苑县| 德州市| 巴南区| 贡嘎县| 达拉特旗| 沂南县| 栖霞市| 镇原县| 巢湖市| 武平县| 深水埗区| 唐山市| 阜新| 黔江区| 高密市| 柏乡县| 营山县| 祁门县| 游戏|