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

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

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

    把困難踩在腳下

    迎難而上

     

    javaWeb 在線人數(shù)統(tǒng)計

    這幾天在做一個在線人數(shù)統(tǒng)計的程序,我費了好大勁在網(wǎng)上查了一些資料,經(jīng)過調(diào)試學(xué)到了一些東西,在這寫兩個簡單的程序介紹一下:

    1.新建一個工程OnlineCount,包結(jié)構(gòu)如下圖所示:

    包結(jié)構(gòu)

    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()   %>人 

    這樣就可以啟動服務(wù)器運行。

    1.初始啟動服務(wù)器運行時:控制臺上會下面的日志信息:

    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中的時間有關(guān)系

    在調(diào)試時你會發(fā)現(xiàn),當一個電腦上裝有不同的瀏覽器時,用另一個瀏覽器再次訪問時,會打出:

    2011-01-18 11:38:16,031 [http-8080-1] [com.dr.demo2.servlet.OnlineCounter] [INFO] - session created:2

    為了避免上述失誤產(chǎn)生,在程序中加入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;//當前活動的人數(shù)
        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()   %>人 

    程序運行結(jié)果:

    1.訪問online.jsp時,控制臺輸出如下:

    1

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

     2

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

    3

     

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

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

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

    評論

    # re: javaWeb 在線人數(shù)統(tǒng)計[未登錄] 2012-12-07 13:48 1

    不錯的文章  回復(fù)  更多評論   

    # re: javaWeb 在線人數(shù)統(tǒng)計 2014-04-03 16:07 阿薩德

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

    # re: javaWeb 在線人數(shù)統(tǒng)計[未登錄] 2015-05-29 17:12 cc

    通過監(jiān)控session來進行統(tǒng)計在線,可靠性能達到10%?  回復(fù)  更多評論   

    # re: javaWeb 在線人數(shù)統(tǒng)計 2015-09-03 15:32 zl

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


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


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計

    公告

    快樂每一天!

    Everything is an object!

    常用鏈接

    留言簿(2)

    隨筆檔案

    學(xué)習網(wǎng)站

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 7x7x7x免费在线观看| 毛片在线看免费版| 亚洲国产精品张柏芝在线观看 | 四虎永久在线精品免费一区二区| 精品国产人成亚洲区| 免费视频成人片在线观看| 亚洲中文字幕无码中文字| 亚洲一区无码精品色| 1000部拍拍拍18勿入免费视频下载| 亚洲AV无码国产一区二区三区| 三上悠亚亚洲一区高清| 免费专区丝袜脚调教视频| 窝窝影视午夜看片免费| 亚洲欧洲日产国码www| 亚洲av手机在线观看| 国产亚洲精久久久久久无码77777| 国产免费AV片在线观看 | 香蕉视频免费在线| 亚洲美女视频一区二区三区| 免费国产成人高清在线观看麻豆| 久久福利青草精品资源站免费| 亚洲国产成人精品无码区花野真一 | 亚洲国产精品嫩草影院在线观看 | 亚洲欧洲日产国码一级毛片| 2021精品国产品免费观看| 日韩在线视频线视频免费网站| 亚洲av永久无码精品天堂久久 | 国产亚洲成归v人片在线观看 | 久久久久久亚洲精品成人| 亚洲精品成a人在线观看| 最新猫咪www免费人成| 午夜精品免费在线观看| 国产99视频精品免费视频76| 亚洲一线产区二线产区区| 久久精品亚洲中文字幕无码麻豆| 亚洲最大av无码网址| 日韩中文无码有码免费视频| 中文字幕亚洲码在线| 亚洲AV无码久久精品成人| 亚洲乱码国产一区网址| 国产成人无码a区在线观看视频免费 |