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

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

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

    把困難踩在腳下

    迎難而上

     

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

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

    1.新建一個(gè)工程O(píng)nlineCount,包結(jié)構(gòu)如下圖所示:

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

    demo1:新建一個(gè)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中寫(xiě)入以下語(yǔ)句:

       

     <listener>   
        
    <listener-class>   
        com.dr.demo2.servlet.OnlineCounter   
        
    </listener-class>   
        
    </listener>  

        
    <session-config>
        
    <session-timeout>1</session-timeout><!-- 默認(rèn)時(shí)間為分鐘 -->
        
    </session-config> 

    新建一個(gè)online.jsp,在body中寫(xiě)入以下語(yǔ)句:

    <%@   page   import= "com.dr.demo2.servlet.OnlineCounter"   %>  
        在線: <%=  OnlineCounter.getOnlineSession()   %>人 

    這樣就可以啟動(dòng)服務(wù)器運(yùn)行。

    1.初始啟動(dòng)服務(wù)器運(yùn)行時(shí):控制臺(tái)上會(huì)下面的日志信息:

    2011-01-18 11:11:47,968 [main] [com.dr.demo2.servlet.OnlineCounter] [INFO] - OnlineCounter initialized.

    2.在瀏覽器地址欄中中訪問(wèn)online.jsp:控制臺(tái)上打出,

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

    3.大約一分鐘過(guò)后,控制臺(tái)上會(huì)打出:

    2011-01-18 11:39:10,265 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] [com.dr.demo2.servlet.OnlineCounter] [INFO] - session destroied

    這跟在web.xml中的時(shí)間有關(guān)系

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

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

    為了避免上述失誤產(chǎn)生,在程序中加入IP過(guò)濾:

    demo2:新建一個(gè)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;//當(dāng)前活動(dòng)的人數(shù)
        private HttpServletRequest request;
        
    private static ArrayList list = new ArrayList();//用來(lái)存放不同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){                      //如果隊(duì)列中存在相同的IP 則SESSION不增加
                list.add(loginIp);
               log.info(
    "ipList隊(duì)列新增ip: "+loginIp);
                activeSessions
    ++;
                log.info(
    "新增SESSION,sessionId = " + sessionId +"; createTime = " + createTime
                                 
    + "; loginIp = " + loginIp +"; 當(dāng)前總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隊(duì)列移除ip: "+loginIp);
                        }

                    }

                }

                activeSessions
    --;                   //在用戶銷(xiāo)毀的時(shí)候,從隊(duì)列中踢出這個(gè)IP
                log.info("銷(xiāo)毀SESSION,sessionId = " + sessionId +"; overTime = " + overTime
                                 
    + "; loginIp = " + loginIp +"; 當(dāng)前總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><!-- 默認(rèn)時(shí)間為分鐘 -->
        
    </session-config> 

    online.jsp代碼改為如下代碼:

    <%@   page   import= "com.dr.demo2.servlet.SessionCounter"   %>  
        在線: <%=  SessionCounter.getActiveSessions()   %>人 

    程序運(yùn)行結(jié)果:

    1.訪問(wèn)online.jsp時(shí),控制臺(tái)輸出如下:

    1

    2.用不同的瀏覽器訪問(wèn)時(shí),控制臺(tái)輸出如下:

     2

    3.用不同的電腦訪問(wèn)時(shí),控制臺(tái)輸出如下:

    3

     

    4.大概一分鐘過(guò)后,控制臺(tái)上輸出如下:

    4
    希望各位大蝦批評(píng)指正!

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

    評(píng)論

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

    不錯(cuò)的文章  回復(fù)  更多評(píng)論   

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

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

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

    通過(guò)監(jiān)控session來(lái)進(jìn)行統(tǒng)計(jì)在線,可靠性能達(dá)到10%?  回復(fù)  更多評(píng)論   

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

    這種文章還是不要拿出來(lái)講。  回復(fù)  更多評(píng)論   


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


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

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    快樂(lè)每一天!

    Everything is an object!

    常用鏈接

    留言簿(2)

    隨筆檔案

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

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲国产成人影院播放| 国产免费牲交视频| 女人18毛片特级一级免费视频| 在线免费视频一区| 亚洲国产中文字幕在线观看| 国产亚洲精品美女久久久| 亚洲电影在线免费观看| 亚洲爆乳少妇无码激情| 中文字幕免费观看视频| 亚洲视频在线免费播放| 韩国免费三片在线视频| 亚洲自偷自偷偷色无码中文| 亚洲综合久久成人69| 亚洲av成人一区二区三区观看在线| 国产成人精品免费大全| 4hu四虎最新免费地址| 国产一区二区三区免费在线观看| 国产亚洲一区二区手机在线观看 | 麻豆狠色伊人亚洲综合网站 | 精品亚洲成A人无码成A在线观看| 亚洲精品精华液一区二区| 国产免费区在线观看十分钟| 国产免费的野战视频| 亚洲国产成人久久综合碰| 亚洲精品国产第1页| 日本特黄特色AAA大片免费| 久久国产精品一区免费下载| 日韩毛片免费在线观看| 亚洲大尺度无码专区尤物| 亚洲色欲啪啪久久WWW综合网| 中文字幕手机在线免费看电影 | 亚洲国产精品第一区二区| 亚洲成av人片在线看片| 四虎影视久久久免费观看| 59pao成国产成视频永久免费 | 无码视频免费一区二三区| 中文亚洲AV片不卡在线观看| 亚洲精品福利你懂| 日韩a级无码免费视频| 免费的一级黄色片| 亚洲一区二区在线视频|