<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)

    隨筆檔案

    學習網站

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产高清不卡免费在线| 四虎国产精品免费永久在线| 24小时免费看片| 亚洲精品成人网站在线播放| 久久青草免费91线频观看不卡 | 久久精品国产亚洲AV无码麻豆| 免费一级不卡毛片| 亚洲AV日韩AV无码污污网站 | 国产免费人成在线视频| 亚洲αⅴ无码乱码在线观看性色| 四虎成人免费影院网址| 老司机午夜性生免费福利| 狠狠色婷婷狠狠狠亚洲综合| 中国精品一级毛片免费播放| 亚洲国产精品人久久| 97性无码区免费| 另类小说亚洲色图| 亚洲午夜国产精品无码| 亚洲精品免费视频| 亚洲AV无码国产精品色| 午夜国产大片免费观看| 香蕉免费在线视频| 亚洲男女性高爱潮网站| 日本19禁啪啪无遮挡免费动图| 一本到卡二卡三卡免费高| 亚洲av日韩综合一区在线观看| 99视频免费观看| 亚洲成AV人片高潮喷水| 亚洲色欲色欲www在线丝 | 国产高清在线免费| 中文无码日韩欧免费视频| 内射干少妇亚洲69XXX| 在线播放免费人成视频在线观看| 深夜免费在线视频| 亚洲一区中文字幕久久| 国产一区二区三区无码免费| 中国一级特黄的片子免费 | 免费看又爽又黄禁片视频1000| 免费一级全黄少妇性色生活片| 亚洲AV日韩AV天堂久久| 最新69国产成人精品免费视频动漫|