在码农的世界里只有bug才能让人成长,The more bugs you encounter, the more efficient you will be!

java中的监听器分为三种:ServletRequestListener、HttpSessionListener、ServletContextListener;

ServletRequest--请求,在客户端对服务器发生请求(访问)时发生,请求一次发生一次(不考虑请求转发),

请求结束,该对象销毁;

HttpSession--会话,单个用户在某段时间内(Tomcat默认为30min,可以设置),自第一次发生请求(访问)

时创建,直到过期,该对象销毁;

ServletContext--上下文,该对象存在于服务器端,自服务器开启时创建,直到服务器关闭该对象销毁。

那么,就有这样一个思路:一个用户持续对网站的访问,请求数会很多,但是该用户多次请求的Session却一

直都是一个(唯一性)。我们可以在第一次访问时把Session对象的ID存到服务器(上下文),后面每一次请求的

时候,我们可以检查,该请求的Session对象是否已经在服务器(上下文),如果在,说明这次请求和之前的某次

请求是同一个用户,如果不在,那么将这个请求产生的新Session对象的ID存到服务器(上下文)。Session对象到

期,自然就被销毁(可以看做用户长时间每活动,被迫下线了),那么将这个SessionID所在的整条信息删除,也

就是可以看做,当前访问用户减少一个。其实除了多次请求产生的Session具有唯一性之外,发出请求的设备也是

具有唯一性的,我们可以通过获得设备的IP进行标识。我们可以将这两个信息存到用户类中,每个用户对象都有这

两个属性,并且是唯一的。

1.ServletRequest监听器

 public class Requestlisen implements ServletRequestListener {

     public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub } public void requestInitialized(ServletRequestEvent arg0) {
// TODO Auto-generated method stub
System.out.println("-----request创建了-------");
HttpServletRequest request = (HttpServletRequest) arg0
.getServletRequest();
if (arg0.getServletContext().getAttribute("userlist") == null) {
List<User> userlist = new ArrayList<User>();
arg0.getServletContext().setAttribute("userlist", userlist);
}
List<User> userlist = (List<User>) arg0.getServletContext()
.getAttribute("userlist");
String id = request.getSession().getId();
User user = (User) Getuserbyid.finduser(userlist, id);
if (user == null) {
System.out.println("-----当前请求对象不存在于服务器-----");
System.out.println("------将当前用户添加到服务器-----");
User newuser = new User();
newuser.setIp(request.getRemotePort() + "");
newuser.setSessionid(id);
userlist.add(newuser);
arg0.getServletContext().setAttribute("userlist", userlist);
}
}
}

在这个监听器中,我们只需要在请求初始化的时候,根据这个请求产生的SessionID判断,当前SessionID

所属的用户是否存在于服务器用户列表中,如果不存在,就新建一个用户(包含IP和SessionID信息),并

存入服务器用户列表。当然当第一个用户访问服务器时,用户列表是空的,为了防止出现空指针异常,我们

要在此时为服务器创建一个用户列表。

2.HttpSession监听器

 public class Sessionlisten implements HttpSessionListener {
private int count;
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("-----新建会话-----");
count++;
arg0.getSession().getServletContext().setAttribute("usercount", count);
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
count--;
arg0.getSession().getServletContext().setAttribute("usercount", count);
System.out.println("-----会话销毁-----");
List<User> userlist = (List<User>) arg0.getSession()
.getServletContext().getAttribute("userlist");
String id = arg0.getSession().getId();
User user = (User) Getuserbyid.finduser(userlist, id);
userlist.remove(user);
arg0.getSession().getServletContext()
.setAttribute("userlist", userlist);
System.out.println("-------当前用户从服务器删除-----");
}
}

在Session对象监听器中,当一个会话创建时(有新用户访问),我们设置访问量加1,

当一个会话销毁时,表示一个用户掉线了,没有对服务器进行访问了,那么访问量减1,并且我们通过当

前会话ID获得这个用户,并且将这个用户从服务器用户列表删除。

下面是根据SessionID查询用户的功能类:

 public class Getuserbyid {
public static Object finduser(List<User> userlist,String id){
if(userlist!=null){
for(User user:userlist){
if(user.getSessionid().equals(id)){
return user;
}
}
}
return null;
}
}

因为Session对象销毁时之前,这个Session对象所属的用户信心必定是早就存到上下文对象中了(服务器用

户列表),那么自然是存在的,我们就根据SessionID这个字段来遍历所有用户的SessionID属性,从而找到

这个用户,将其从列表删除。

注意:监听器创建之后要进行注册,不然是不能够起到监听作用的。还有就是不要忘记写一个页面来展示一下

存在于用户列表的所有用户信息。

   <%
List<User> userlist=(List<User>)request.getServletContext().getAttribute("userlist");
%>
在线人数:<%=userlist.size() %><br> <%
if(userlist!=null){
for (User user :userlist){
%>
IP地址:<%=user.getIp() %>----sessionId:<%=user.getSessionid() %><br> <%
}}
%>
在线人数:2
IP地址:0:0:0:0:0:0:0:1----sessionId:18166147D09F290A25924ACF9753E19D 同一台电脑两个浏览器访问,IP自然相同
IP地址:0:0:0:0:0:0:0:1----sessionId:43C373670AF88EE244CBF7E6585F2285

完结撒花~~~~~~

java监听器之实现在线人数显示的更多相关文章

  1. Java监听器Listener使用详解

    监听器用于监听web应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法.常用于统计在线人数和在线用 ...

  2. 使用Session监听器实现统计在线人数

    使用Session监听器实现统计在线人数 1.工作目录结构 包含监听器类和jsp页面 2.session监听器 首先利用session监听器来实现对访问网站时的session计数,当有session创 ...

  3. Java监听器listener的介绍

    Java监听器listener的介绍 listener 能做什么 当web中某些动作发生之后,服务器就调用listener中对应的方法. 内部机制 接口回调 Web监听器 步骤 创建需要的监听器类,实 ...

  4. JAVA监听器原理

    http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...

  5. JAVA监听器Listener

    JAVA监听器Listener 一. 简介 监听器用于对web中内置对象的状态或者属性变化进行监听并做出相应响应的一种Servlet;在内置对象的生命周期中,产生.销毁等状态发生变化时,监听器就会进行 ...

  6. JMeter 查看结果树监听器响应数据中文显示乱码解决方法

    查看结果树监听器响应数据中文显示乱码解决方法 by:授客 QQ:1033553122   问题描述 使用监听器-查看结果树(View Results Tree Listener)过程中发现,响应数据面 ...

  7. Java监听器Listener使用说明

    转载:http://blog.csdn.net/meng2602956882/article/details/13511587 1.什么是Java监听器 监听器也叫Listener,是Servlet的 ...

  8. springboot使用HttpSessionListener 监听器统计当前在线人数

    概括: request.getSession(true):若存在会话则返回该会话,否则新建一个会话. request.getSession(false):若存在会话则返回该会话,否则返回NULL ht ...

  9. 自己编写一个Java监听器

    Java监听器 1.原理: 当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法. 例如:创建一个“人”类Class Person 人拥有吃的方法public void eat(){},我 ...

随机推荐

  1. 设计比较好,有助于学习的Github上的iOS App源码 (中文)

    Github版 中文 : TeamTalk 蘑菇街. 开源IM. 电商强烈推荐. MyOne-iOS 用OC写的<一个> iOS 客户端 zhihuDaily 高仿知乎日报 Coding ...

  2. Chapter 2 User Authentication, Authorization, and Security(1):选择Windows和SQL 身份验证

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38657111,专题目录:http://blog.csdn.net/dba_huangzj ...

  3. 使用WakeLock使Android应用程序保持后台唤醒

     在使用一些产品列如微信.QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息来临了.但是,一般情况下手机锁屏后,Android系统为了省电以及减少CP ...

  4. (八)喜马拉雅Demo引出的细节(代理模式和图片缩放)

    喜玛拉雅是一款电台APP,界面非常美观,通过模仿这一APP学习到很多细节. 1.图片导入后有些框内不全如何补全: 寻常的办法是再准备一张图片拖入,比较好的办法是右击已经导入的图片选择Show in F ...

  5. PLSQL_R12 MOAC多组织的四个应用(案例)

    一.摘要 R12 Form 或者其他二次开发时,很多情况下会涉及R12 MOAC多组织开发,以下介绍了4个常见的应用,如有遗漏还请学友继续补充 1. 开发时打开Form自动弹出组织选择实现方式(增加C ...

  6. C++多重继承与虚拟继承

    本文只是粗浅讨论一下C++中的多重继承和虚拟继承. 多重继承中的构造函数和析构函数调用次序 我们先来看一下简单的例子: #include <iostream> using namespac ...

  7. apktool动态破解apk

    那么今天我们就用另外一种方式来破解apk:动态方式,关于动态方式其实很广义的,因为动态方式相对于静态方式来说,难度大一点,但是他比静态方式高效点,能够针对更过的破解范围.当然动态方式很多,所以这里就分 ...

  8. RTMPdump(libRTMP) 源代码分析 8: 发送消息(Message)

    ===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...

  9. hbase thrift 定义

    /*  * Licensed to the Apache Software Foundation (ASF) under one  * or more contributor license agre ...

  10. objc写一个NSMutableArray不连续索引替换对象的方法

    NSMutableArray内置的方法-(void)replaceObjectsAtIndexes:(NSIndexSet*)set withObjects:(NSArray*)objs 只能替换一段 ...