1. Globale statistische Variablenklasse der Website, nur globale Variablen definieren
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. Implementieren Sie die ServletContext-Überwachung zum Aufzeichnen von Serverinformationen
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. Implementieren Sie die HttpSessionListener- und HttpSessionAttributeListener-Überwachung, die zum Aufzeichnen von Anmeldeinformationen, der Gesamtzahl der Besucher, der Anzahl der Online-Personen und der Realisierung einer Einzelanmeldung usw. verwendet wird.
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. Implementieren Sie die Anforderungsüberwachung, die zum Aufzeichnen von Kundeninformationen wie IP, URL usw. verwendet wird.
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. Konfigurieren Sie eine Listenerzeile in web.xml
<listener><listener-class>com.lt.listener.MyContextListener</listener-class></listener><listener><listener-class>com.lt.listener.MySessionListener</listener-class></listener><listener><listener-class>com.lt.listener.MyRequestListener</listener-class></listener>
Listener-Typ:
1. Listener, der die Erstellung und Zerstörung von Objekten überwacht:
HttpSessionListener: sessionCreated(HttpSessionEvent sessionEvent) , sessionDestroyed(HttpSessionEvent sessionEvent)
ServletRequestListener: requestInitialized(ServletRequestEvent event), requestDestroyed(ServletRequestEvent event)
ServletContextListener: contextInitialized(ServletContextEvent event), contextDestroyed(ServletContextEvent event)
2. Auf Änderungen in den Eigenschaften des Objekts achten. Listener:
HttpSessionAttributeListener: (wird beim Hinzufügen, Aktualisieren oder Entfernen einer Sitzung ausgelöst)
attributeAdded(HttpSessionBindingEvent event), attributeReplaced(HttpSessionBindingEvent event) , attributeRemoved(HttpSessionBindingEvent event)
ServletContextAttributeListener: (wird ausgelöst, wenn Kontext hinzugefügt, aktualisiert oder entfernt wird)
attributeAdded(ServletContextAttributeEvent event), attributeReplaced(ServletContextAttributeEvent event), attributeRemoved(ServletContextAttributeEvent event)
ServletRequestAttributeListener: (Hinzufügen, Aktualisieren, Verschieben wird ausgelöst, wenn keine Anforderung vorliegt)
attributeAdded(ServletRequestAttributeEvent event), attributeReplaced(ServletRequestAttributeEvent event), attributeRemoved(ServletRequestAttributeEvent event)
3. Hören Sie zu zu den Objekten in der Sitzung
HttpSessionBindingListener: ( Wird ausgelöst, wenn das Objekt in die Sitzung eingefügt und aus der Sitzung entfernt wird)
ValueBound(HttpSessionBindingEvent event), valueUnbound(HttpSessionBindingEvent event)
HttpSessionActivationListener: (Das Objekt in der Sitzung wird passiviert und das Objekt wird reaktiviert. Auslösen von ps beim Laden: Der Vorgang des Speicherns des Inhalts in der Sitzung auf der Festplatte wird als Passivierung bezeichnet. Die Passivierung muss die Serialisierbare Serialisierung implementieren Schnittstelle)
sessionWillPassivate(HttpSessionEvent-Ereignis), sessionDidActivate(HttpSessionEvent-Ereignis)
Das obige ist der detaillierte Inhalt vonBeispiel für die Verwendung von Listener zur Implementierung globaler Statistiken auf der Website. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!