<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    把困難踩在腳下

    迎難而上

     

    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 馮魁 閱讀(7103) 評論(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)

    隨筆檔案

    學習網站

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 啦啦啦中文在线观看电视剧免费版| 久久精品a一国产成人免费网站| 在线电影你懂的亚洲| 精品国产无限资源免费观看| 在线看亚洲十八禁网站| 亚洲αv在线精品糸列| 亚洲精品动漫免费二区| 一级毛片视频免费观看| 亚洲日本在线播放| 亚洲第一区在线观看| 91大神在线免费观看| 国产天堂亚洲精品| 久久久久亚洲AV成人片| 亚洲国产av无码精品| 亚洲毛片免费观看| 国产黄在线观看免费观看不卡 | 亚洲精品无码专区久久久| 大地资源免费更新在线播放| av片在线观看永久免费| 亚洲午夜一区二区电影院| 亚洲人成网站在线观看青青| 国语成本人片免费av无码| 男人都懂www深夜免费网站| 无码天堂va亚洲va在线va| 亚洲日韩乱码中文无码蜜桃| 国产亚洲日韩一区二区三区| 成年午夜视频免费观看视频| 久久国产精品成人片免费| 四虎成人精品国产永久免费无码| 亚洲一区二区三区无码国产| 国产AV无码专区亚洲AVJULIA | 四虎在线免费视频| 国产午夜精品理论片免费观看| 亚洲av永久中文无码精品| 亚洲一区影音先锋色资源| 亚洲熟伦熟女新五十路熟妇| 无码视频免费一区二三区| 18女人毛片水真多免费| 两个人看的www免费| 一级做a毛片免费视频| 国产精品亚洲色婷婷99久久精品|