首页布局:index.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="java.util.*" %>
  4. <%@ page import="com.hanqi.model.*" %>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  9. <title>Insert title here</title>
  10. </head>
  11. <body>
  12. 当前在线人数: <%=application.getAttribute("userCount") %>
  13. <hr>
  14. 在线用户列表:<br>
  15. <%
  16. List<User> userList = (List<User>)application.getAttribute("userList");
  17. if(userList!=null) {
  18. for(User u : userList) {
  19. out.print(u+"<br>");
  20. }
  21. }
  22. %>
  23. </body>
  24. </html>

创建用户信息:User

  1. package com.hanqi.model;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5.  
  6. public class User {
  7. private String sessionid;
  8. private Date firstTime;
  9.  
  10. public String getSessionid() {
  11. return sessionid;
  12. }
  13.  
  14. public void setSessionid(String sessionid) {
  15. this.sessionid = sessionid;
  16. }
  17.  
  18. public Date getFirstTime() {
  19. return firstTime;
  20. }
  21.  
  22. public void setFirstTime(Date firstTime) {
  23. this.firstTime = firstTime;
  24. }
  25.  
  26. @Override
  27. public int hashCode() {
  28. final int prime = 31;
  29. int result = 1;
  30. result = prime * result + ((firstTime == null) ? 0 : firstTime.hashCode());
  31. result = prime * result + ((sessionid == null) ? 0 : sessionid.hashCode());
  32. return result;
  33. }
  34.  
  35. @Override
  36. public boolean equals(Object obj) {
  37. if (this == obj)
  38. return true;
  39. if (obj == null)
  40. return false;
  41. if (getClass() != obj.getClass())
  42. return false;
  43. User other = (User) obj;
  44. if (firstTime == null) {
  45. if (other.firstTime != null)
  46. return false;
  47. } else if (!firstTime.equals(other.firstTime))
  48. return false;
  49. if (sessionid == null) {
  50. if (other.sessionid != null)
  51. return false;
  52. } else if (!sessionid.equals(other.sessionid))
  53. return false;
  54. return true;
  55. }
  56.  
  57. @Override
  58. public String toString() {
  59. return "User [sessionid=" + sessionid + ", 最近登录时间="
  60. + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(firstTime) + "]";
  61. }
  62.  
  63. }

编写监听器:TestSessionListener

  1. package com.hanqi.listener;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.Iterator;
  6.  
  7. import javax.servlet.annotation.WebListener;
  8. import javax.servlet.http.HttpSession;
  9. import javax.servlet.http.HttpSessionEvent;
  10. import javax.servlet.http.HttpSessionListener;
  11.  
  12. import com.hanqi.model.User;
  13.  
  14. /**
  15. * Application Lifecycle Listener implementation class TestSessionListener
  16. *
  17. */
  18. @WebListener
  19. public class TestSessionListener implements HttpSessionListener {
  20.  
  21. private int userCount;
  22.  
  23. private ArrayList<User> userList;
  24.  
  25. /**
  26. * Default constructor.
  27. */
  28. public TestSessionListener() {
  29. // TODO Auto-generated constructor stub
  30. }
  31.  
  32. /**
  33. * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
  34. */
  35. public void sessionCreated(HttpSessionEvent sessionEvent) {
  36. userCount++;
  37. if(userList==null) {
  38. userList = new ArrayList<User>();
  39. }
  40. HttpSession session = sessionEvent.getSession();
  41.  
  42. String sessionid = session.getId();
  43. long stime = session.getCreationTime();
  44.  
  45. if(!checkUsersSession(sessionid, userList)) {
  46. User u = new User();
  47. u.setFirstTime(new Date(stime));
  48. u.setSessionid(sessionid);
  49. userList.add(u);
  50. }
  51.  
  52. session.getServletContext().setAttribute("userCount", userCount);
  53. session.getServletContext().setAttribute("userList", userList);
  54. }
  55.  
  56. private boolean checkUsersSession(String sessionid, ArrayList<User> userList2) {
  57. for(User u : userList2) {
  58. if(u.getSessionid().equals(sessionid)) {
  59. return true;
  60. }
  61. }
  62. return false;
  63. }
  64.  
  65. /**
  66. * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
  67. */
  68. public void sessionDestroyed(HttpSessionEvent sessionEvent) {
  69. userCount--;
  70. HttpSession session = sessionEvent.getSession();
  71.  
  72. String sessionid = session.getId();
  73. System.out.println(sessionid + "的用户下线");
  74.  
  75. if(checkUsersSession(sessionid, userList)) {
  76. Iterator<User> iter = userList.iterator();
  77. while(iter.hasNext()) {
  78. User u = iter.next();
  79. if(u.getSessionid().equals(sessionid)) {
  80. iter.remove();
  81. }
  82. }
  83. }
  84. session.getServletContext().setAttribute("userCount", userCount);
  85. session.getServletContext().setAttribute("userList", userList);
  86. }
  87.  
  88. }

在web.xml文件中注册监听器

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id="WebApp_ID" version="3.0">
  6.  
  7. <listener>
  8. <listener-class>com.hanqi.listener.TestSessionListener</listener-class>
  9. </listener>
  10.  
  11. <session-config>
  12. <session-timeout>1</session-timeout>
  13. </session-config>
  14.  
  15. </web-app>

Javaweb基础--->利用监听器统计在线用户数量和用户信息的更多相关文章

  1. 利用 awk 统计nginx 中某一个用户的访问次数

    线上总是会遇到攻击,所以就需要分析 access.log 看看那些用户的访问次数不正常,针对这些不正常的用户,要做处理,以 access.log为例说明下怎么统计. 通过 access.log 日志来 ...

  2. JavaWeb基础-过滤器监听器

    过滤器 1定义:过滤器是一个服务器的组件,他可以截取用户端的请求与响应信息,并对这些信息进行过滤;过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 2过滤器的工作原理: 3过滤器 ...

  3. 利用Clojure统计代码文件数量和代码行数

    ;; 引入clojure的io包 (use '[clojure.java.io]) ;; 遍历目录将所有符合要求的文件做为列表返回 (defn walk [dirpath pattern] (doal ...

  4. 利用终端统计 Xcode代码数量命令

    直接利用终端命令进入工程文件夹然后写下或复制以下命令 find . -name "*.m" -or -name "*.h" -or -name "*. ...

  5. Tomcat集群下获取memcached缓存对象数量,统计在线用户数据量

    项目需要统计在线用户数量,系统部署在集群环境下,使用会话粘贴的方式解决Session问题.要想得到真实在线用户数,必须是所有节点的总和. 这里考虑使用memcached存放用户登录数据,key为use ...

  6. 让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能

    你的 Nginx 已经有了 RTMP 直播功能的话,如果你还想统计某直播频道当前观看用户量的话,可以加入 with-http_xslt_module 模块.具体步骤如下:        1.查看原来的 ...

  7. 使用 Redis 统计在线用户人数

    在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...

  8. 利用MySQL统计一列中不同值的数量方法示例

    前言 本文实现的这个需求其实十分普遍,举例来说,我们存在一个用户来源表,用来标记用户从哪个渠道注册进来.表结构如下所示… 其中 origin 是用户来源,其中的值有 iPhone .Android . ...

  9. 用HttpSessionListener统计在线用户或做账号在线人数管理

    使用HttpSessionListener接口可监听session的创建和失效 session是在用户第一次访问页面时创建 在session超时或调用request.getSession().inva ...

随机推荐

  1. Oracle PLSQL通过SMTP发送E-MAIL邮件代码

    登录到SMTPserver发送邮件,支持HTML CREATE OR REPLACE PROCEDURE send_mail(        p_recipient VARCHAR2, -- 邮件接收 ...

  2. 已经入了vim的坑

    一.移动光标 1.左移h.右移l.下移j.上移k 2.向下翻页ctrl + f,向上翻页ctrl + b 3.向下翻半页ctrl + d,向上翻半页ctrl + u 4.移动到行尾$,移动到行首0(数 ...

  3. JDBC技术总结(三)

    1. 数据库连接池 JDBC部分的前两个总结主要总结了一下JDBC的基本操作,而且有个共同点,就是应用程序都是直接获取数据库连接的.这会有个弊端:用户每次请求都需要向数据库获得连接,而数据库创建连接通 ...

  4. Android XMPP 即时通讯

    0 http://blog.csdn.net/lnb333666/article/details/7471292 0.1 http://www.cnblogs.com/charley_yang/arc ...

  5. HDU 1014 Uniform Generator 题解

    找到规律之后本题就是水题了.只是找规律也不太easy的.证明这个规律成立更加不easy. 本题就是求step和mod假设GCD(最大公约数位1)那么就是Good Choice,否则为Bad Choic ...

  6. fedora20配置静态ip

    在linux的世界里.给主机设置固定ip是这么做的(使用root用户): 1.查看要配的网络接口 用ifconfig查看查看在用的网卡接口,一般都用第一个如:eth0,en1,em1等 2.停用网络自 ...

  7. C#中使用泛型对照使用通用基础类型效率减少近一倍

     C#中使用泛型对照使用通用基础类型效率减少近一倍 以下是測试结果: CSharp class and generic TotalMilliseconds: 270772.9229CSharp g ...

  8. IIS8应用池重启脚本

    重启 IIS8 应用程序池的批处理 批处理很简单:c:\windows\system32\inetsrv\AppCmd.exe stop apppool /apppool.name:"ASP ...

  9. IIS中使用ASP.NET MVC的经验总结

    在这篇文章中我们学习在不同版本的IIS中使用ASP.NET MVC和URL Routing.我们学习针对IIS7.0.IIS6.0和更早版本的IIS的处理策略. ASP.NET MVC框架依赖于URL ...

  10. xml初学简单介绍

    什么是XML? 1.全称Extensible Markup Language,可扩展标记语言,W3C组织公布. 2.XML用来保存有一定结构关系的数据. 3.标签的嵌套,实质是一串字符串. 4.跨平台 ...