1. Web サイトのグローバル統計変数クラス、グローバル変数のみを定義します
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. サーバー情報を記録するためのサーブレットコンテキスト監視を実装します
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 モニタリングを実装します。これは、ログイン情報、訪問者の総数、オンラインの人数を記録し、シングル ログインを実現するために使用されます。顧客の情報 IP、URL などを記録するために使用されるリクエスト監視を実装します。
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 }
5. Web でリスナーの行を設定します。オブジェクト:
HttpSessionAttributeListener: (セッションの追加、更新、または削除時にトリガーされます)
以上がリスナーを使用して Web サイトにグローバル統計を実装する例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。