利用Listener实现网站累积访问人数、最大同时在线人数、当前登录用户数的记录
2021-07-14 08:05
标签:nbsp 记录登录信息 override err todo vax 用户 view info 1.网站全局统计变量类,只定义全局变量 2.实现servletContext监听,用于记录服务器信息 3.实现 HttpSessionListener, HttpSessionAttributeListener监听,用于记录登录信息、访问总人数、在线人数,实现单一登录等 4.实现 request监听,用于记录客户信息 ip、url等 5.在web.xml中配置队一行的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) 利用Listener实现网站累积访问人数、最大同时在线人数、当前登录用户数的记录 标签:nbsp 记录登录信息 override err todo vax 用户 view info 原文地址:http://www.cnblogs.com/liutie/p/7076402.html 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
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 }
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 }
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 }
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>
上一篇:web过滤器
文章标题:利用Listener实现网站累积访问人数、最大同时在线人数、当前登录用户数的记录
文章链接:http://soscw.com/essay/105014.html