利用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 LIUTIE
11  *
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 }
View Code

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 LIUTIE
12  *
13  */
14 public class MyContextListener implements ServletContextListener {
15 
16     /**
17      * 服务器启动时被调用
18      */
19     @Override
20     public void contextDestroyed(ServletContextEvent arg0) {
21         //记录启动时间
22         ApplicationConstants.SERVER_START_DATE = new Date();
23     }
24 
25     /**
26      * 服务器关闭时被调用
27      */
28     @Override
29     public void contextInitialized(ServletContextEvent arg0) {
30         //保存数据到硬盘
31         // TODO Auto-generated method stub
32     }
33 
34 }
View Code

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 }
View Code

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 LIUTIE
11  *
12  */
13 public class MyRequestListener implements ServletRequestListener {
14 
15     /**
16      * request销毁时调用
17      */
18     @Override
19     public void requestDestroyed(ServletRequestEvent event) {
20         // TODO Auto-generated method stub
21 
22     }
23 
24     /**
25      * request创建时调用
26      */
27     @Override
28     public void requestInitialized(ServletRequestEvent event) {
29         HttpServletRequest request = (HttpServletRequest) event;
30         // 客户端ip
31         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 }
View Code

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>    
View Code

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)

转载于:https://www.cnblogs.com/liutie/p/7076402.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现显示当前在线人数和历史访问量功能,可以使用以下步骤: 1. 创建一个 HTML 文件,用于显示在线人数和历史访问量。 2. 在 HTML 文件中,使用 JavaScript 和 Ajax 技术,从后台获取在线人数和历史访问量的数据并显示出来。 3. 在后台编写一个 Java Servlet,用于处理前端发送的 Ajax 请求,返回当前在线人数和历史访问量的数据。 4. 在 Java Servlet 中,使用 ServletContext 对象来保存在线人数和历史访问量的数据,并在每次用户访问网站时更新数据。 5. 在 IDEA 中创建一个 Web 项目,将 HTML 文件和 Java Servlet 部署到该项目中。 以下是实现在线人数和历史访问量功能的示例代码: HTML 文件: ```html <!DOCTYPE html> <html> <head> <title>在线人数和历史访问量</title> </head> <body> <p>当前在线人数:<span id="online"></span></p> <p>历史访问量:<span id="total"></span></p> <script> // 使用 Ajax 技术从后台获取数据并显示出来 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var data = JSON.parse(xhr.responseText); document.getElementById("online").innerHTML = data.online; document.getElementById("total").innerHTML = data.total; } }; xhr.open("GET", "data", true); xhr.send(); </script> </body> </html> ``` Java Servlet: ```java import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletContext; public class DataServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 从 ServletContext 中获取在线人数和历史访问量的数据 ServletContext context = getServletContext(); int online = (int)context.getAttribute("online"); int total = (int)context.getAttribute("total"); // 将数据转换成 JSON 格式并返回给前端 String data = String.format("{\"online\": %d, \"total\": %d}", online, total); response.setContentType("application/json"); response.getWriter().write(data); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` Java Servlet 的初始化: ```java import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class InitListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { // 在 ServletContext 中保存在线人数和历史访问量的数据 ServletContext context = sce.getServletContext(); context.setAttribute("online", 0); context.setAttribute("total", 0); } public void contextDestroyed(ServletContextEvent sce) { } } ``` Java Servlet 的更新: ```java import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class UpdateListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { // 当有用户访问网站时,将在线人数加 1 HttpSession session = se.getSession(); ServletContext context = session.getServletContext(); synchronized(context) { int online = (int)context.getAttribute("online"); context.setAttribute("online", online + 1); int total = (int)context.getAttribute("total"); context.setAttribute("total", total + 1); } } public void sessionDestroyed(HttpSessionEvent se) { // 当用户关闭浏览器或离开网站时,将在线人数减 1 HttpSession session = se.getSession(); ServletContext context = session.getServletContext(); synchronized(context) { int online = (int)context.getAttribute("online"); context.setAttribute("online", online - 1); } } } ``` 在 IDEA 中创建一个 Web 项目,并将 HTML 文件和 Java Servlet 部署到该项目中。在 web.xml 文件中配置 Servlet 和监听器: ```xml <web-app> <servlet> <servlet-name>DataServlet</servlet-name> <servlet-class>DataServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DataServlet</servlet-name> <url-pattern>/data</url-pattern> </servlet-mapping> <listener> <listener-class>InitListener</listener-class> </listener> <listener> <listener-class>UpdateListener</listener-class> </listener> </web-app> ``` 这样就可以实现显示当前在线人数和历史访问量的功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值