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

    隨筆檔案

    學習網站

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 精品剧情v国产在免费线观看| 免费人成在线观看网站视频| 在线观看亚洲天天一三视| 亚洲av永久无码精品三区在线4| 有码人妻在线免费看片| 国产免费不卡视频| 亚洲精品无码av人在线观看| 欧美亚洲国产SUV| 99久久久精品免费观看国产| 亚洲成av人在线视| 青青视频免费在线| 嫩草影院在线免费观看| 久久丫精品国产亚洲av| 中国好声音第二季免费播放| 日本免费一二区在线电影| 亚洲一卡2卡4卡5卡6卡在线99| 国产免费av一区二区三区| 永久黄网站色视频免费| 亚洲无线一二三四区| 久久成人a毛片免费观看网站| 亚洲国产精品综合久久网络| 亚洲爆乳无码专区www| 国产免费久久精品99re丫y| 亚洲综合成人网在线观看| a级片免费观看视频| 亚洲精品NV久久久久久久久久| 亚洲国产区男人本色| 蜜桃视频在线观看免费网址入口| 亚洲一区中文字幕久久| a级毛片免费完整视频| 亚洲熟妇少妇任你躁在线观看无码| 亚洲av无码兔费综合| 国产在线国偷精品产拍免费| 亚洲精品综合久久中文字幕| 久久国产乱子伦精品免费不卡| 亚洲自偷自偷偷色无码中文| 一区二区三区免费精品视频| xvideos亚洲永久网址| 成人免费观看男女羞羞视频| 免费真实播放国产乱子伦| 亚洲日韩av无码中文|