>  기사  >  Java  >  Listener를 사용하여 웹 사이트에 전역 통계를 구현하는 예

Listener를 사용하여 웹 사이트에 전역 통계를 구현하는 예

零下一度
零下一度원래의
2017-06-27 10:19:311435검색

1. 웹사이트 전역 통계 변수 클래스, 전역 변수만 정의

 1 package com.lt.listener; 2  3 import java.util.Date; 4 import java.util.HashMap; 5 import java.util.Map; 6  7 import javax.servlet.http.HttpSession; 8 /** 9  * 网站全局变量类10  * @author LIUTIE11  *12  */13 public abstract class ApplicationConstants {14     15     /**16      * 用户登录session名称17      */18     public static final String LOGIN_SESSION_NAME = "userInfo";19 20     /**21      * 索引所有的session  
22      * 用于单一登录23      */24     public static Map<String,HttpSession> SESSION_MAP = new HashMap<>();25     26     /**27      * 当前在线用户数28      */29     public static int CURRENT_LOGIN_COUNT = 0;30     31     /**32      * 历史访客总数33      */34     public static int TOTAL_HISTORY_COUNT = 0;35     36     /**37      * 最高同时在线人数38      */39     public static int MAX_ONLINE_COUNT = 0;40     41     /**42      * 服务器启动时间43      */44     public static Date SERVER_START_DATE = new Date();45     46     /**47      * 最高在线人数时间48      */49     public static Date MAX_ONLINE_COUNT_DATE = new Date();50     51     52     53 }
코드 보기

2. 서버 정보 기록을 위한 servletContext 모니터링 구현

 1 package com.lt.listener; 2  3 import java.util.Date; 4  5 import javax.servlet.ServletContextEvent; 6 import javax.servlet.ServletContextListener; 7  8 /** 9  * servletContext监听10  * 记录服务器信息 启动关闭时间等11  * @author LIUTIE12  *13  */14 public class MyContextListener implements ServletContextListener {15 16     /**17      * 服务器启动时被调用18      */19     @Override20     public void contextDestroyed(ServletContextEvent arg0) {21         //记录启动时间22         ApplicationConstants.SERVER_START_DATE = new Date();23     }24 25     /**26      * 服务器关闭时被调用27      */28     @Override29     public void contextInitialized(ServletContextEvent arg0) {30         //保存数据到硬盘31         // TODO Auto-generated method stub32     }33 34 }
코드 보기

3. 로그인 정보, 총 방문자 수, 온라인 사용자 수, 단일 로그인 달성 등을 기록하는 데 사용되는 HttpSessionListener, HttpSessionAttributeListener 모니터링을 구현합니다.

  1 package com.lt.listener;  2   3 import java.util.Date;  4   5 import javax.servlet.http.HttpSession;  6 import javax.servlet.http.HttpSessionAttributeListener;  7 import javax.servlet.http.HttpSessionBindingEvent;  8 import javax.servlet.http.HttpSessionEvent;  9 import javax.servlet.http.HttpSessionListener; 10  11 /** 12  * session监听 13  * 记录登录信息 访问总人数 在线人数等 14  * 实现单一登录 15  * @author LIUTIE 16  * 17  */ 18 public class MySessionListener implements HttpSessionListener, HttpSessionAttributeListener { 19  20     /** 21      * session创建时被调用 22      */ 23     @Override 24     public void sessionCreated(HttpSessionEvent sessionEvent) { 25         // 获取创建的session 26         HttpSession session = sessionEvent.getSession(); 27         // 添加到map 28         ApplicationConstants.SESSION_MAP.put(session.getId(), session); 29         // 访问总人数++ 30         ApplicationConstants.TOTAL_HISTORY_COUNT++; 31         // 如果map总数大于最高同时在线人数则更新最高在线人数及时间 32         if (ApplicationConstants.MAX_ONLINE_COUNT < ApplicationConstants.SESSION_MAP.size()) { 33             ApplicationConstants.MAX_ONLINE_COUNT = ApplicationConstants.SESSION_MAP.size(); 34             ApplicationConstants.MAX_ONLINE_COUNT_DATE = new Date(); 35         } 36  37     } 38  39     /** 40      * session销毁时被调用 41      */ 42     @Override 43     public void sessionDestroyed(HttpSessionEvent sessionEvent) { 44         // 获取即将被销毁的session 45         HttpSession session = sessionEvent.getSession(); 46         // 在map中根据key移除 47         ApplicationConstants.SESSION_MAP.remove(session.getId()); 48     } 49  50     /** 51      * 添加session属性时被调用 52      */ 53     @Override 54     public void attributeAdded(HttpSessionBindingEvent event) { 55         // 判断是否添加的用户登录信息session 56         if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) { 57             // 当前登录用户数++ 58             ApplicationConstants.CURRENT_LOGIN_COUNT++; 59             // 是否在其他机器登录处理 60             isLoginInOtherPlace(event); 61         } 62     } 63  64     /** 65      * 移除session属性时被调用 66      */ 67     @Override 68     public void attributeRemoved(HttpSessionBindingEvent event) { 69         // 判断是否移除的用户登录信息session 70         if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) { 71             // 当前登录用户数-- 72             ApplicationConstants.CURRENT_LOGIN_COUNT--; 73             // 是否在其他机器登录处理 74             isLoginInOtherPlace(event); 75         } 76     } 77  78     /** 79      * 修改session属性时被调用 80      */ 81     @Override 82     public void attributeReplaced(HttpSessionBindingEvent event) { 83  84         // 判断是否修改的用户登录信息session 85         if (event.getName().equals(ApplicationConstants.LOGIN_SESSION_NAME)) { 86             // 是否在其他机器登录处理 87             isLoginInOtherPlace(event); 88         } 89     } 90  91     /** 92      * 是否在其他机器登录处理 93      * 
 94      * @param event 95      */ 96     private void isLoginInOtherPlace(HttpSessionBindingEvent event) { 97         // 获取添加的session 98         HttpSession session = event.getSession(); 99         // 遍历查找此用户是否登录100         for (HttpSession s : ApplicationConstants.SESSION_MAP.values()) {101             // 如果已经在其他机器登录则使其失效102             if (event.getValue().equals(s.getAttribute(ApplicationConstants.LOGIN_SESSION_NAME))103                     && session.getId() != s.getId()) {104                 // 使session失效105                 session.invalidate();106                 break;107             }108         }109     }110 }
코드 보기

4. 고객 정보 IP, URL 등을 기록하는 데 사용되는 요청 모니터링을 구현합니다.

 1 package com.lt.listener; 2  3 import javax.servlet.ServletRequestEvent; 4 import javax.servlet.ServletRequestListener; 5 import javax.servlet.http.HttpServletRequest; 6  7 /** 8  * request监听 用于记录客户信息 ip、url等 9  * 
10  * @author LIUTIE11  *12  */13 public class MyRequestListener implements ServletRequestListener {14 15     /**16      * request销毁时调用17      */18     @Override19     public void requestDestroyed(ServletRequestEvent event) {20         // TODO Auto-generated method stub21 22     }23 24     /**25      * request创建时调用26      */27     @Override28     public void requestInitialized(ServletRequestEvent event) {29         HttpServletRequest request = (HttpServletRequest) event;30         // 客户端ip31         String ip = request.getRemoteAddr();32         // 访问的URL地址33         String url = request.getRequestURI();34         // 只做简单后台打印35         System.out.println("The client ip is " + ip);36         System.out.println("The address url is " + url);37     }38 39 }
코드 보기

5. 웹에서 리스너 라인을 구성합니다. 객체:

 HttpSessionListener: sessionCreated(HttpSessionEvent sessionEvent), sessionDestroyed(HttpSessionEvent sessionEvent) ServletRequestListener: requestInitialized(ServletRequestEvent 이벤트), requestDestroyed(ServletRequestEvent 이벤트)
 ServletContextListener: contextInitialized(ServletContextEvent 이벤트), contextDe stroyed(ServletContextEvent 이벤트) 2 . 객체의 속성 변경을 모니터링하기 위한 리스너:

 HttpSessionAttributeListener: (세션 추가, 업데이트 또는 제거 시 트리거됨)

 attributeAdded(HttpSessionBindingEvent 이벤트), attributeReplaced(HttpSessionBindingEvent 이벤트), attributeRemoved(Ht tpSessionBindingEvent 이벤트) On ServletConTextAttributelistener: (트리거되는 경우) 컨텍스트 추가, 업데이트, 제거)

AttributeAdDed(ServletContextAteEvent 이벤트), AttributeRePlaced(서버 IButeevent 이벤트), AttributeReMoved(ServletContextattributeeEvent)

ServletRequestAttributelistener: (요청 추가, 업데이트, 제거)

)

  attributeAdded(ServletRequestEvent 이벤트), 배치( ServletRequestAttributeEvent 이벤트), attributeRemoved(ServletRequestAttributeEvent 이벤트)

 3. 세션 내 개체 모니터링

 HttpSessionBindingListener: (객체가 세션에 배치되거나 세션에서 제거될 때 트리거됨)

valueBound(HttpSessionBindingEvent 이벤트), valueUnbound(HttpSessionBindingEvent 이벤트 )

 HttpSessionActivationListener: (세션의 개체가 비활성화되고 개체가 다시 로드될 때 트리거됨 ps: 세션의 콘텐츠를 하드 디스크에 저장하는 프로세스를 비활성화라고 하며, 비활성화에는 직렬화 가능 직렬화가 필요합니다. 인터페이스)

 sessionWillPassivate (HttpSessionEvent 이벤트), sessionDidActivate(HttpSessionEvent 이벤트)

위 내용은 Listener를 사용하여 웹 사이트에 전역 통계를 구현하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.