把困難踩在腳下

          迎難而上

           

          javaWeb 在線人數統計

          這幾天在做一個在線人數統計的程序,我費了好大勁在網上查了一些資料,經過調試學到了一些東西,在這寫兩個簡單的程序介紹一下:

          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時,控制臺輸出如下:

          1

          2.用不同的瀏覽器訪問時,控制臺輸出如下:

           2

          3.用不同的電腦訪問時,控制臺輸出如下:

          3

           

          4.大概一分鐘過后,控制臺上輸出如下:

          4
          希望各位大蝦批評指正!

          posted on 2011-01-18 11:59 馮魁 閱讀(7109) 評論(4)  編輯  收藏

          評論

          # re: javaWeb 在線人數統計[未登錄] 2012-12-07 13:48 1

          不錯的文章  回復  更多評論   

          # re: javaWeb 在線人數統計 2014-04-03 16:07 阿薩德

          String loginIp = request.getRemoteAddr();
          獲取為空  回復  更多評論   

          # re: javaWeb 在線人數統計[未登錄] 2015-05-29 17:12 cc

          通過監控session來進行統計在線,可靠性能達到10%?  回復  更多評論   

          # re: javaWeb 在線人數統計 2015-09-03 15:32 zl

          這種文章還是不要拿出來講。  回復  更多評論   


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


          網站導航:
           

          導航

          統計

          公告

          快樂每一天!

          Everything is an object!

          常用鏈接

          留言簿(2)

          隨筆檔案

          學習網站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 顺昌县| 商水县| 伊通| 嘉义市| 许昌市| 龙胜| 龙口市| 府谷县| 通州区| 高平市| 浦东新区| 金溪县| 百色市| 城口县| 霞浦县| 元阳县| 石门县| 定远县| 巍山| 罗田县| 房山区| 枝江市| 斗六市| 蒙城县| 万山特区| 辉县市| 西畴县| 依兰县| 辽宁省| 黄平县| 巍山| 衡水市| 闵行区| 广州市| 崇信县| 日土县| 甘肃省| 崇州市| 黔西| 吉木乃县| 策勒县|