Javaweb统计在线人数的小栗子
最近在学习Javaweb相关的内容(不黑不吹之前对web开发零基础),下面通过一个统计在线人数的小栗子讲讲Servlet监听器吧
开发环境 eclipse tomcat 7
先说说这个小栗子的构思:
首先要考虑的就是通过什么方式能够统计在线人数?很容易想到可以通过session来统计在线人数为什么不是request呢?因为request在请求结束时即服务器返回资源时就被销毁了,也就是说request的作用域不足以用以统计在线人数。服务器在第一次接受一个用户请求时会给该用户分配一个sessionid在有效期结束后或是用户主动关闭浏览器一段时间后session会被销毁,所以用session来统计在线人数是合情合理的。
接下来问题来了,知道了统计在线人数和session相关那么应该如何操作呢?下面说说Servlet监听器。
Servlet监听器只要就是用来对Web应用进行监听和控制的,功能接近Java的GUI程序的监听器,可以监听由于Web应用程序状态改变而引起的Servlet容器产生的相应事件,然后作出处理。
Servlet监听器分为Servlet上下文监听器,Http会话监听器,Servlet请求监听器。
既然用到了Session那我们先来看看Session相关的监听器吧。查看Apache文档
HttpSessionListener接口有两个方法
对应的是session被创建和被销毁时调用的。定义一个监听器类实现HttpSessionListener接口代码如下所示
package com.xiaoysec; import java.util.ArrayList; import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* Application Lifecycle Listener implementation class MyHttpSessionListener
*
*/ public class MyHttpSessionListener implements HttpSessionListener {
private int numberCount = 0; /**
* Default constructor.
*/
public MyHttpSessionListener() {
// TODO Auto-generated constructor stub
} /**
* @see HttpSessionListener#sessionCreated(HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
numberCount++;
arg0.getSession().getServletContext()
.setAttribute("numberCount", numberCount);
} /**
* @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
numberCount--;
arg0.getSession().getServletContext()
.setAttribute("numberCount", numberCount);
ArrayList<Userinfo> userlist = (ArrayList<Userinfo>) arg0.getSession()
.getServletContext().getAttribute("userlist");
if (SessionUtil.getUsersessionid(userlist, arg0.getSession().getId()) != null) {
userlist.remove(SessionUtil.getUsersessionid(userlist, arg0
.getSession().getId()));
}
} }
在Session被创建时numberCount++,在被销毁时numberCount--。这样,一个简单的在线人数统计功能就实现了,接下来完善一下,如果想看到客户端的ip信息又该怎么办呢?首先还是思考如何获取用户信息,很容易想到可以通过request获取客户端的信息。
定义一个封装用户信息的Javabean,代码如下:
 package com.xiaoysec;
 public class Userinfo {
     private String sessionid;
     private String ip;
     private String recenttime;
     public String getSessionid() {
         return sessionid;
     }
     public void setSessionid(String sessionid) {
         this.sessionid = sessionid;
     }
     public String getIp() {
         return ip;
     }
     public void setIp(String ip) {
         this.ip = ip;
     }
     public String getRecenttime() {
         return recenttime;
     }
     public void setRecenttime(String recenttime) {
         this.recenttime = recenttime;
     }
 }
定义一个类MyServletRquestListener实现ServletRequestListener接口,在该接口中定义了一个requestInitialized方法,在服务器端接收到客户端的请求时被调用,
代码如下:
package com.xiaoysec; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date; import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest; public class MyServletRquestListener implements ServletRequestListener {
private ArrayList<Userinfo> userlist; // 在綫用戶的list @Override
public void requestDestroyed(ServletRequestEvent arg0) {
// TODO Auto-generated method stub } /**
* 在初始化request的初始化中判斷是否存在user的信息(sessionid)如果不存在的話就保存在userlist中
*/
@Override
public void requestInitialized(ServletRequestEvent arg0) {
userlist = (ArrayList<Userinfo>) arg0.getServletContext().getAttribute("userlist");
if(userlist==null)
userlist = new ArrayList<Userinfo>();
HttpServletRequest req = (HttpServletRequest) arg0.getServletRequest();
String sessionid = req.getSession().getId();
if (SessionUtil.getUsersessionid(userlist, sessionid) == null) {
Userinfo user = new Userinfo();
user.setIp(req.getRemoteAddr());
user.setSessionid(sessionid);
user.setRecenttime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()));
userlist.add(user);
}
arg0.getServletContext().setAttribute("userlist", userlist);
} }
接着写一个SessionUtil类实现了getUsersessionid方法,代码如下:
 package com.xiaoysec;
 import java.util.ArrayList;
 public class SessionUtil {
     public static Object getUsersessionid(ArrayList<Userinfo> userlist,String sessionid) {
          for(int i=0;i<userlist.size();i++){
               Userinfo info = userlist.get(i);
               if(userlist.get(i).getSessionid().equals(sessionid)) //表示当前的sessionid用户存在于用户list中不需要
                   return info;
          }
         return null;
     }
 }
在getUsersessionid中参数为userlist和sessionid,通过一个循环判断sessionid所指的用户是否在userlist中如果在的话就返回用户信息info,如果不在的话就返回null并在MyServletRquestListener的31行处添加进userlist。
最后是界面jsp展示
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
当前用户在线人数<%= application.getAttribute("numberCount") %><br/>
<%
ArrayList<com.xiaoysec.Userinfo> userlist = (ArrayList<com.xiaoysec.Userinfo>)request
.getServletContext().getAttribute("userlist");
if(userlist!=null){
for (int i=0;i<userlist.size();i++) {
com.xiaoysec.Userinfo info = userlist.get(i);
%>
ip:<%=info.getIp()%><br />
recentTime:<%=info.getRecenttime()%><br/>
sessionid:<%=info.getSessionid()%><br/>
<%
}}
%>
</body>
</html>

总结:通过这个小栗子只是对Servlet监听器有一个小小的了解,还是需要多看源码,理解过程,多代码,多思考,多总结。
Javaweb统计在线人数的小栗子的更多相关文章
- asp.net MVC 统计在线人数功能实现
		
今天开发一个设计一个统计在线人数的统计.实现方式是在MVC 中,用户次执行一个Action请求完成后,向数据表中插入一条用户心跳记录,统计在线人数则是根据该记录,30分钟内有记录的用户则为在线状态. ...
 - 利用php比较精确的统计在线人数的办法
		
利用php比较精确的统计在线人数的办法,注意这里所说的精确是指个数,如果需要精确在时间上,则需要根据实际情况调整代码中的有效时间.(自己没有写,从别人那拿过来的,先放着然后再研究)<?php// ...
 - (实用篇)php精确的统计在线人数的方法
		
这是一个非常精确的,通过php实现统计在线人数的方法,想知道怎么实现的请耐心阅读. <?php $filename='online.txt';//数据文件 $cookiename='VGOTCN ...
 - Application 统计在线人数
		
MVC 统计在线人数: protected void Application_Start() { Application[; AreaRegistration.RegisterAllAreas(); ...
 - PHP实现统计在线人数功能示例
		
本文实例讲述了PHP实现统计在线人数的方法.分享给大家供大家参考,具体如下: 我记得ASP里面统计在线人数用application 这个对象就可以了.PHP怎么设计? PHP对session对象的封装 ...
 - cookie小栗子-实现简单的身份验证
		
关于Cookie Cookie是一种能够让网站Web服务器把少量数据储存到客户端的硬盘或内存里,或是从客户端的硬盘里读取数据的一种技术. 用来保存客户浏览器请求服务器页面的请求信息,可以在HTTP返回 ...
 - SpringBoot+Shiro+Redis共享Session入门小栗子
		
在单机版的Springboot+Shiro的基础上,这次实现共享Session. 这里没有自己写RedisManager.SessionDAO.用的 crazycake 写的开源插件 pom.xml ...
 - SpringBoot+Shiro入门小栗子
		
写一个不花里胡哨的纯粹的Springboot+Shiro的入门小栗子 效果如图: 首页:有登录注册 先注册一个,然后登陆 登录,成功自动跳转到home页 home页:通过认证之后才可以进 代码部分: ...
 - 一个小栗子聊聊JAVA泛型基础
		
背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪. 对泛型的认识不够,导致代码出现了BUG. 第一个原因可以通过以后编码 ...
 
随机推荐
- [原]容器学习(二):动手模拟AOP
			
简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架.上文已经介绍模拟IoC实现,这篇文章来动手模拟AOP. AOP简述 面向对象强调"一切皆是对象" ...
 - Xcode 真机测试破解方法(转加修改)xcode 4.3 通过
			
Xcode 真机测试破解方法(转加修改)xcode 4.3 通过 生成本机证书 应用程序->实用工具->钥匙串访问 菜单:钥匙串访问->证书助理->创建证书, 然后按以下图片顺 ...
 - iOS-BLE蓝牙开发
			
Demo地址:WEBlueToothManager 在写这个博客之前,空余时间抽看了近一个月的文档和Demo,系统给的解释很详细,接口也比较实用,唯独有一点,对于设备 的唯一标示,网上众说纷纭,在这里 ...
 - 前端新人学习笔记-------html/css/js基础知识点
			
即将毕业的软件工程大学生一枚,秋季招聘应聘的是Android,今年来到公司实习,要求做前端开发,所以一切只有现学,现在根据视频来学习,然后开这个博客记录一下自己的学习过程,废话不多说,开写. 4月6日 ...
 - ToDoList-学习中看到的知识盲点
			
1. java中的volatile关键字的作用 2. java类加载器 3. Android源码编译 4. MediaPlayer的用法 5. Html5和web app
 - 七种Prolog解释器/编译器
			
http://blog.sina.com.cn/s/blog_494e45fe0100lh1v.html PROLOG 人工智能领域常用的语言,开发自然语言分析,专家系统,以及所有和智能有关的程序,都 ...
 - sql 练习(3)
			
1.打印九九乘法表 ) ,exp)) A, ,exp))B, ,exp))C, ,exp))D, ,exp))E, ,exp))F, ,exp))G, ,exp))H, ,exp))I from ( ...
 - C++/C#结构体转化-二维数组-bytes To Strings
			
C++结构体 typedef struct VidyoClientRequestGetWindowsAndDesktops_ { /*! The number of application windo ...
 - C++_基础_继承、多态
			
内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的 ...
 - 建立一个ROS msg and srv
			
msg是一个描述ROS消息字段的简单的文本文件,它们经常用来为消息产生不同语言的源代码. srv文件描述一个服务,它由请求和响应两部分组成. msg文件被存储在一个包的msg目录下,srv文件被存储在 ...