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 ...
随机推荐
- Oracle PLSQL通过SMTP发送E-MAIL邮件代码
登录到SMTPserver发送邮件,支持HTML CREATE OR REPLACE PROCEDURE send_mail( p_recipient VARCHAR2, -- 邮件接收 ...
- 已经入了vim的坑
一.移动光标 1.左移h.右移l.下移j.上移k 2.向下翻页ctrl + f,向上翻页ctrl + b 3.向下翻半页ctrl + d,向上翻半页ctrl + u 4.移动到行尾$,移动到行首0(数 ...
- JDBC技术总结(三)
1. 数据库连接池 JDBC部分的前两个总结主要总结了一下JDBC的基本操作,而且有个共同点,就是应用程序都是直接获取数据库连接的.这会有个弊端:用户每次请求都需要向数据库获得连接,而数据库创建连接通 ...
- Android XMPP 即时通讯
0 http://blog.csdn.net/lnb333666/article/details/7471292 0.1 http://www.cnblogs.com/charley_yang/arc ...
- HDU 1014 Uniform Generator 题解
找到规律之后本题就是水题了.只是找规律也不太easy的.证明这个规律成立更加不easy. 本题就是求step和mod假设GCD(最大公约数位1)那么就是Good Choice,否则为Bad Choic ...
- fedora20配置静态ip
在linux的世界里.给主机设置固定ip是这么做的(使用root用户): 1.查看要配的网络接口 用ifconfig查看查看在用的网卡接口,一般都用第一个如:eth0,en1,em1等 2.停用网络自 ...
- C#中使用泛型对照使用通用基础类型效率减少近一倍
C#中使用泛型对照使用通用基础类型效率减少近一倍 以下是測试结果: CSharp class and generic TotalMilliseconds: 270772.9229CSharp g ...
- IIS8应用池重启脚本
重启 IIS8 应用程序池的批处理 批处理很简单:c:\windows\system32\inetsrv\AppCmd.exe stop apppool /apppool.name:"ASP ...
- IIS中使用ASP.NET MVC的经验总结
在这篇文章中我们学习在不同版本的IIS中使用ASP.NET MVC和URL Routing.我们学习针对IIS7.0.IIS6.0和更早版本的IIS的处理策略. ASP.NET MVC框架依赖于URL ...
- xml初学简单介绍
什么是XML? 1.全称Extensible Markup Language,可扩展标记语言,W3C组织公布. 2.XML用来保存有一定结构关系的数据. 3.标签的嵌套,实质是一串字符串. 4.跨平台 ...