用Listener实现对网站全局统计实例
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.实现 request监听,用于记录客户信息 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.在web.xml中配置队一行的listener


<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种类:
1.监听对象的创建与销毁的Listener:
HttpSessionListener: sessionCreated(HttpSessionEvent sessionEvent)、sessionDestroyed(HttpSessionEvent sessionEvent)
ServletRequestListener: requestInitialized(ServletRequestEvent event)、requestDestroyed(ServletRequestEvent event)
ServletContextListener: contextInitialized(ServletContextEvent event)、contextDestroyed(ServletContextEvent event)
2.监听对象的属性变化的Listener:
HttpSessionAttributeListener:(添加、更新、移除session时触发)
attributeAdded(HttpSessionBindingEvent event)、attributeReplaced(HttpSessionBindingEvent event)、attributeRemoved(HttpSessionBindingEvent event)
ServletContextAttributeListener:(添加、更新、移除context时触发)
attributeAdded(ServletContextAttributeEvent event)、attributeReplaced(ServletContextAttributeEvent event)、attributeRemoved(ServletContextAttributeEvent event)
ServletRequestAttributeListener:(添加、更新、移除request时触发)
attributeAdded(ServletRequestAttributeEvent event)、attributeReplaced(ServletRequestAttributeEvent event)、attributeRemoved(ServletRequestAttributeEvent event)
3.监听Session内的对象
HttpSessionBindingListener:(对象放入session、对象从session移除时触发)
valueBound(HttpSessionBindingEvent event)、valueUnbound(HttpSessionBindingEvent event)
HttpSessionActivationListener:(session中的对象被钝化、对象被重新加载时触发ps:将session中的内容保存到硬盘的过程叫做钝化,钝化需实现Serializable序列化接口)
sessionWillPassivate(HttpSessionEvent event)、sessionDidActivate(HttpSessionEvent event)
Atas ialah kandungan terperinci 用Listener实现对网站全局统计实例. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Dengan kebangkitan media sosial, WeChat telah menjadi salah satu alat komunikasi yang sangat diperlukan dalam kehidupan seharian orang ramai. Walau bagaimanapun, ramai orang mungkin menghadapi masalah: log masuk ke beberapa akaun WeChat pada masa yang sama pada telefon mudah alih yang sama. Bagi pengguna telefon mudah alih Huawei, tidak sukar untuk mencapai log masuk WeChat dwi Artikel ini akan memperkenalkan cara mencapai log masuk WeChat dwi pada telefon mudah alih Huawei. Pertama sekali, sistem EMUI yang disertakan dengan telefon mudah alih Huawei menyediakan fungsi yang sangat mudah - pembukaan dua aplikasi. Melalui fungsi pembukaan dwi aplikasi, pengguna boleh serentak

Bahasa pengaturcaraan PHP ialah alat yang berkuasa untuk pembangunan web, yang mampu menyokong pelbagai logik dan algoritma pengaturcaraan yang berbeza. Antaranya, melaksanakan jujukan Fibonacci adalah masalah pengaturcaraan biasa dan klasik. Dalam artikel ini, kami akan memperkenalkan cara menggunakan bahasa pengaturcaraan PHP untuk melaksanakan jujukan Fibonacci, dan melampirkan contoh kod tertentu. Jujukan Fibonacci ialah jujukan matematik yang ditakrifkan seperti berikut: unsur pertama dan kedua bagi jujukan ialah 1, dan bermula dari unsur ketiga, nilai setiap unsur adalah sama dengan jumlah dua unsur sebelumnya. Beberapa elemen pertama urutan

Bagaimana untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Dengan populariti perisian sosial dan penekanan yang semakin meningkat terhadap privasi dan keselamatan orang ramai, fungsi klon WeChat telah beransur-ansur menjadi tumpuan perhatian. Fungsi klon WeChat boleh membantu pengguna log masuk ke berbilang akaun WeChat pada telefon mudah alih yang sama pada masa yang sama, menjadikannya lebih mudah untuk diurus dan digunakan. Tidak sukar untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Anda hanya perlu mengikuti langkah berikut. Langkah 1: Pastikan versi sistem telefon mudah alih dan versi WeChat memenuhi keperluan Pertama, pastikan versi sistem telefon mudah alih Huawei anda telah dikemas kini kepada versi terkini, serta Apl WeChat.

Dalam bidang pembangunan perisian hari ini, Golang (bahasa Go), sebagai bahasa pengaturcaraan yang cekap, ringkas dan sangat bersesuaian, semakin digemari oleh pembangun. Perpustakaan standardnya yang kaya dan ciri-ciri konkurensi yang cekap menjadikannya pilihan berprofil tinggi dalam bidang pembangunan permainan. Artikel ini akan meneroka cara menggunakan Golang untuk pembangunan permainan dan menunjukkan kemungkinan besarnya melalui contoh kod tertentu. 1. Kelebihan Golang dalam pembangunan permainan Sebagai bahasa yang ditaip secara statik, Golang digunakan dalam membina sistem permainan berskala besar.

Melaksanakan operasi pembahagian yang tepat di Golang adalah keperluan biasa, terutamanya dalam senario yang melibatkan pengiraan kewangan atau senario lain yang memerlukan pengiraan ketepatan tinggi. Operator bahagian terbina dalam Golang "/" dikira untuk nombor titik terapung, dan kadangkala terdapat masalah kehilangan ketepatan. Untuk menyelesaikan masalah ini, kami boleh menggunakan perpustakaan pihak ketiga atau fungsi tersuai untuk melaksanakan operasi pembahagian yang tepat. Pendekatan biasa ialah menggunakan jenis Tikus daripada pakej matematik/besar, yang menyediakan perwakilan pecahan dan boleh digunakan untuk melaksanakan operasi pembahagian yang tepat.

Panduan Pelaksanaan Keperluan Permainan PHP Dengan populariti dan perkembangan Internet, pasaran permainan web menjadi semakin popular. Ramai pembangun berharap untuk menggunakan bahasa PHP untuk membangunkan permainan web mereka sendiri, dan melaksanakan keperluan permainan adalah langkah utama. Artikel ini akan memperkenalkan cara menggunakan bahasa PHP untuk melaksanakan keperluan permainan biasa dan menyediakan contoh kod khusus. 1. Cipta watak permainan Dalam permainan web, watak permainan adalah elemen yang sangat penting. Kita perlu mentakrifkan atribut watak permainan, seperti nama, tahap, nilai pengalaman, dll., dan menyediakan kaedah untuk mengendalikannya

Sebagai platform sosial video pendek yang terkenal di dunia, Douyin telah memenangi hati sebilangan besar pengguna dengan algoritma pengesyoran peribadi yang unik. Artikel ini akan menyelidiki nilai dan prinsip pengesyoran video Douyin untuk membantu pembaca memahami dengan lebih baik dan menggunakan sepenuhnya ciri ini. 1. Apakah video yang disyorkan oleh Douyin? Platform Douyin menganalisis sejarah tontonan pengguna, gelagat suka dan komen, berkongsi rekod dan data lain untuk memilih dan mengesyorkan video yang paling sesuai dengan citarasa pengguna daripada perpustakaan video yang besar. Sistem pengesyoran diperibadikan ini bukan sahaja menambah baik pengalaman pengguna, tetapi juga membantu pengguna menemui lebih banyak kandungan video yang sepadan dengan pilihan mereka, sekali gus meningkatkan kelekatan dan kadar pengekalan pengguna. di sini

Saya benar-benar minta maaf kerana saya tidak dapat memberikan panduan pengaturcaraan masa nyata, tetapi saya boleh memberikan anda contoh kod untuk memberi anda pemahaman yang lebih baik tentang cara menggunakan PHP untuk melaksanakan SaaS. Berikut ialah artikel dalam 1,500 perkataan, bertajuk "Menggunakan PHP untuk melaksanakan SaaS: Analisis komprehensif." Dalam era maklumat hari ini, SaaS (Perisian sebagai Perkhidmatan) telah menjadi cara arus perdana bagi perusahaan dan individu untuk menggunakan perisian. Ia menyediakan cara yang lebih fleksibel dan mudah untuk mengakses perisian. Dengan SaaS, pengguna tidak perlu berada di premis
