Javaweb基础--->利用监听器统计在线用户数量和用户信息
首页布局:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="com.hanqi.model.*" %>
<!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("userCount") %>
<hr>
在线用户列表:<br>
<%
List<User> userList = (List<User>)application.getAttribute("userList");
if(userList!=null) {
for(User u : userList) {
out.print(u+"<br>");
}
}
%>
</body>
</html>
创建用户信息:User
package com.hanqi.model; import java.text.SimpleDateFormat;
import java.util.Date; public class User {
private String sessionid;
private Date firstTime; public String getSessionid() {
return sessionid;
} public void setSessionid(String sessionid) {
this.sessionid = sessionid;
} public Date getFirstTime() {
return firstTime;
} public void setFirstTime(Date firstTime) {
this.firstTime = firstTime;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firstTime == null) ? 0 : firstTime.hashCode());
result = prime * result + ((sessionid == null) ? 0 : sessionid.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (firstTime == null) {
if (other.firstTime != null)
return false;
} else if (!firstTime.equals(other.firstTime))
return false;
if (sessionid == null) {
if (other.sessionid != null)
return false;
} else if (!sessionid.equals(other.sessionid))
return false;
return true;
} @Override
public String toString() {
return "User [sessionid=" + sessionid + ", 最近登录时间="
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(firstTime) + "]";
} }
编写监听器:TestSessionListener
package com.hanqi.listener; import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator; import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; import com.hanqi.model.User; /**
* Application Lifecycle Listener implementation class TestSessionListener
*
*/
@WebListener
public class TestSessionListener implements HttpSessionListener { private int userCount; private ArrayList<User> userList; /**
* Default constructor.
*/
public TestSessionListener() {
// TODO Auto-generated constructor stub
} /**
* @see HttpSessionListener#sessionCreated(HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent sessionEvent) {
userCount++;
if(userList==null) {
userList = new ArrayList<User>();
}
HttpSession session = sessionEvent.getSession(); String sessionid = session.getId();
long stime = session.getCreationTime(); if(!checkUsersSession(sessionid, userList)) {
User u = new User();
u.setFirstTime(new Date(stime));
u.setSessionid(sessionid);
userList.add(u);
} session.getServletContext().setAttribute("userCount", userCount);
session.getServletContext().setAttribute("userList", userList);
} private boolean checkUsersSession(String sessionid, ArrayList<User> userList2) {
for(User u : userList2) {
if(u.getSessionid().equals(sessionid)) {
return true;
}
}
return false;
} /**
* @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
userCount--;
HttpSession session = sessionEvent.getSession(); String sessionid = session.getId();
System.out.println(sessionid + "的用户下线"); if(checkUsersSession(sessionid, userList)) {
Iterator<User> iter = userList.iterator();
while(iter.hasNext()) {
User u = iter.next();
if(u.getSessionid().equals(sessionid)) {
iter.remove();
}
}
}
session.getServletContext().setAttribute("userCount", userCount);
session.getServletContext().setAttribute("userList", userList);
} }
在web.xml文件中注册监听器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0"> <listener>
<listener-class>com.hanqi.listener.TestSessionListener</listener-class>
</listener> <session-config>
<session-timeout>1</session-timeout>
</session-config> </web-app>
Javaweb基础--->利用监听器统计在线用户数量和用户信息的更多相关文章
- 利用 awk 统计nginx 中某一个用户的访问次数
线上总是会遇到攻击,所以就需要分析 access.log 看看那些用户的访问次数不正常,针对这些不正常的用户,要做处理,以 access.log为例说明下怎么统计. 通过 access.log 日志来 ...
- JavaWeb基础-过滤器监听器
过滤器 1定义:过滤器是一个服务器的组件,他可以截取用户端的请求与响应信息,并对这些信息进行过滤;过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 2过滤器的工作原理: 3过滤器 ...
- 利用Clojure统计代码文件数量和代码行数
;; 引入clojure的io包 (use '[clojure.java.io]) ;; 遍历目录将所有符合要求的文件做为列表返回 (defn walk [dirpath pattern] (doal ...
- 利用终端统计 Xcode代码数量命令
直接利用终端命令进入工程文件夹然后写下或复制以下命令 find . -name "*.m" -or -name "*.h" -or -name "*. ...
- Tomcat集群下获取memcached缓存对象数量,统计在线用户数据量
项目需要统计在线用户数量,系统部署在集群环境下,使用会话粘贴的方式解决Session问题.要想得到真实在线用户数,必须是所有节点的总和. 这里考虑使用memcached存放用户登录数据,key为use ...
- 让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能
你的 Nginx 已经有了 RTMP 直播功能的话,如果你还想统计某直播频道当前观看用户量的话,可以加入 with-http_xslt_module 模块.具体步骤如下: 1.查看原来的 ...
- 使用 Redis 统计在线用户人数
在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...
- 利用MySQL统计一列中不同值的数量方法示例
前言 本文实现的这个需求其实十分普遍,举例来说,我们存在一个用户来源表,用来标记用户从哪个渠道注册进来.表结构如下所示… 其中 origin 是用户来源,其中的值有 iPhone .Android . ...
- 用HttpSessionListener统计在线用户或做账号在线人数管理
使用HttpSessionListener接口可监听session的创建和失效 session是在用户第一次访问页面时创建 在session超时或调用request.getSession().inva ...
随机推荐
- Android学习(六) 文本框边框
BorderTextViews.java package xiaosi.BorderTextView; import android.content.Context; import android.g ...
- OS之os.fork()
有两种方式来实现并发性, 一种方式是让每个“任务"或“进程”在单独的内在空间中工作,每个都有自已的工作内存区域.不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,否 ...
- Velocity.js动画库使用
1.简介 Velocity 是一个简单易用.高性能.功能丰富的轻量级JS动画库.它能和 jQuery 完美协作,并和$.animate()有相同的 API, 但它不依赖 jQuery,可单独使用. 2 ...
- Android实现炫酷SVG动画效果
svg是眼下十分流行的图像文件格式了,svg严格来说应该是一种开放标准的矢量图形语言,使用svg格式我们能够直接用代码来描画图像,能够用不论什么文字处理工具打开svg图像.通过改变部分代码来使图像具有 ...
- linux配置jdk失败
在linux下配置jdk时,/etc/profile下的配置内容是对的,可是输入java -version却发现配置没有成功,这一般都是jdk的安装文件夹权限没有提升的原因,仅仅需用chmod -R ...
- @Autowired @Transaction @Service同时出现。
对于@Autowired,如果只写这些,肯定是根据类型自动装配这个没问题. @Service public class AcRoleServiceImpl implements AcRoleServi ...
- 再议urlconnection和socket区别
利用URL进行通信与利用socket进行通信有许多相似之处.它们都是利用建立连接.获取流来进行通信.那么,它们的区别在何处呢? 利用socket进行通信时,在服务器端运行一个socket通信程序 ...
- pycharm下: conda installation is not found ----一个公开的bug的解决方案
pycharm conda installation is not found ----一个公开的bug的解决方案 pycharm+anaconda 是当前的主流的搭建方案,但是常出现上述问题. ...
- Python内置函数之super()
super(type[,object-or-type]) super()的作用在于类继承方面. 他可以实现不更改类内部代码,但是改变类的父类. 例子: 一般我们继承类的方式: >>> ...
- android 常用方法总结
public class Toolkit { /** * * Role:Telecom service providers获取手机服务商信息 <BR> * * 需要加入权限<uses ...