servlet就实现在线用户表
在学习servlet的过程中,学习了如何用servlet实现在线用户表。
只有服务器处于开机状态才会有在线用户表的存在,在服务器关机的情况下自然就不存在在线用户表的说法;所以,楼主认为在线用户表的信息肯定是不用进行持久化处理的,直接保存在服务器的缓存就好了。
既然保存在缓存中,那么在java web中共有四个作用域,让我们用来存东西:pageContext, request, session,application;既然我们的在线用户表示给大家看的,那自然是应该存在大家都能看到的作用域application中了,所以在服务器开机的时候就应该有一个在线用户表存在application中了,之后都是对这个表的修改。
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
HashMap<String, Visitor> onlineMap=new HashMap<String, Visitor>();//建立在线用户表
ServletContext application= arg0.getServletContext();//获取application
application.setAttribute("online", onlineMap);//将在线用户表存入application
}
明确了这个东西,就可以按照用户到达网站之后的一系列流程来考虑了。首先用户到达网站,服务器后台处理;接着来前台就可以在“在线用户表”上看到新增了一个在线用户;再接着就是用户离开了,服务器后台处理;最后前台就可以看到“在线用户表”上减少了一个在线用户。这么做到了,也就是实现了在线用户表了。基本流程有了,接下来就是分析实现了:
1.用户到达
(1)根据以上的分析,用户到达了我们必须把用户的相关信息存入application中以方便使用;那么怎么判断用户到了呢?用户既然进了网站,那服务器肯定会分配给他一个session的空间,知道了这点就好办了;我们可以建一个session的listener来监听session的创建也就是 sessionCreated()方法了;在这里面我们可以写我们想写的代码了;
public void sessionCreated(HttpSessionEvent arg0) { // TODO Auto-generated method stub HttpSession session=arg0.getSession(); session.setMaxInactiveInterval(1*60);//为方便看到session失效的结果,设置 session过期时间为60秒,默认情况为30分钟 Visitor v=new Visitor(); //新建一个访客对象,保存游客信息 v.setIp(request.getRemoteAddr());//获取访客IP v.setComeFrom(request.getHeader("Referer"));//获取访客来的URL v.setVisitTime(new Date());//记录访客访问时间 ServletContext application= arg0.getSession().getServletContext();//获得 application @SuppressWarnings("unchecked") HashMap<String,Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online");//将在线用户表从application中取出 onlinMap.put(session.getId(), v);//将新到的访客信息放入在线用户表中 application.setAttribute("online", onlinMap);//将更新后的在线用户表存入 application中 }
(2)前台还要能够读取到application中的信息;
由于application是jsp的内置对象,所以我们无需获取吗,直接使用就可以了;
<table> <!-- 表头--> <tr> <th>用户名</th> <th>访问时间</th> <th>用户IP</th> <th>来自页面</th> </tr> <% @SuppressWarnings("unchecked") HashMap<String, Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online");//取出在线用户表 Set<String> key=onlinMap.keySet();//取出在线用户表的键集合 Iterator<String> it=key.iterator();//将键集合中的键一一取出放入Iterator对象中 while(it.hasNext()) //通过遍历在线用户表中所有的键来一一打出在线用户表 { String id=it.next(); Visitor v=onlinMap.get(id); %> <tr> <td><%=v.getId() %></td> <td><%=v.getVisitTime() %></td> <td><%=v.getIp() %></td> <td><%=v.getComeFrom() %></td> </tr> <% } %> </table>
2.用户离开
(1)我们必须得把用户的信息从application中移除
一般我们无法判断用户离开的准确时间,但是我们知道只要session过期了,用户就一定离开了,所以我们可以利用session的listener来监听session的过期,也就是 sessionDestroyed()方法。
public void sessionDestroyed(HttpSessionEvent arg0) { // TODO Auto-generated method stub ServletContext application= arg0.getSession().getServletContext(); @SuppressWarnings("unchecked") HashMap<String, Visitor> onlinMap=(HashMap<String, Visitor>) application.getAttribute("online"); String id=arg0.getSession().getId(); //获得失效session的id Visitor v=onlinMap.get(id); v.setLeftTime(new Date());//记录session失效(用户离开)的时间 onlinMap.remove(id);//从在线用户表中移除离开的用户 //由于复合类型用“=”赋值是通过改变指针实现的,所以后面更改的map其实是直接更改了application里面原本存的map,所以就不需要application.setAttribute("online", onlinMap);这条语句了 }
就这样用servlet就实现在线用户表了。
补充:
1.Visitor实体类
Visitor实体类根据数据库中Visitor表建就好了,就是一个javaBean;
2.关于request的获取
可以建一个request的监听器通过request=(HttpServletRequest) arg0.getServletRequest();来获得request;如果你想全 局使用,只需要将request定义为类的属性就好了,但是要注意request是HttpServletRequest类的实例化不是ServletRequest;
servlet就实现在线用户表的更多相关文章
- Servlet监听器及在线用户
Servlet中的监听器分为三种类型Ⅰ 监听ServletContext.Request.Session作用域的创建和销毁 (1)ServletContextListener (2)HttpSessi ...
- 第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表
第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表.验证码表.轮播图表 创建Django项目 项目 settings.py ...
- mysql在线修改表结构大数据表的风险与解决办法归纳
整理这篇文章的缘由: 互联网应用会频繁加功能,修改需求.那么表结构也会经常修改,加字段,加索引.在线直接在生产环境的表中修改表结构,对用户使用网站是有影响. 以前我一直为这个问题头痛.当然那个时候不需 ...
- 使用Servlet和jdbc创建用户登录验证
首先创建一个用户表,用来保存用户名 密码,并插入几条数据 mysql> desc user;+----------+-------------+------+-----+---------+-- ...
- 基于Redis的在线用户列表解决方案
前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案可以采用SessionListener来完成 ...
- [项目回顾]基于Redis的在线用户列表解决方案
迁移:基于Redis的在线用户列表解决方案 前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案 ...
- 一套海量在线用户的移动端IM架构设计实践分享(含详细图文)(转)
1.写在前面 1.1.引言 如果在没有太多经验可借鉴的情况下,要设计一套完整可用的移动端IM架构,难度是相当大的.原因在于,IM系统(尤其是移动端IM系统)是多种技术和领域知识的横向应用综合体:网络编 ...
- MySQL在线大表DDL操作
在线大表DDL操作的方法: 1.主从架构轮询修改 需要注意: a.主库会话级别的记录binglog的参数关闭 b.500\502错误异常捕捉 c.检查备库的second behind master是否 ...
- MySQL在线大表DDL操作 (转)
http://www.cnblogs.com/janehoo/p/5382474.html 线大表DDL操作的方法: 1.主从架构轮询修改 需要注意: a.主库会话级别的记录binglog的参数关闭 ...
随机推荐
- Oracle PLSQL笔记(过程的创建和及调用)
过程(procedure): 用于在数据库中完成特定的操作或者任务.是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用. 一.创建所需的表USERS create table users ...
- TCP连接的建立与终止
TCP/IP详解学习笔记(13)-- TCP连接的建立与终止 1.TCP连接的建立 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请 ...
- 11 款最好 CSS 框架
11 款最好 CSS 框架 让你的网站独领风骚 网页设计和发展领域已经成为竞争激烈的虚拟世界.想要在网络的虚拟世界中生存,仅有一堆静止的在线网络应用是远远不够的,网页必须要有很多功能,配以让人无法抗拒 ...
- 用Linux命令行实现删除和复制指定类型的文件
(一)Linux 删除当前目录及子目录中所有某种类型的文件 方法1 : 此方法不能处理目录中带空格的那些. rm -rf `find . -name "*.example"` Li ...
- Kendo UI开发教程(8): Kendo UI 特效概述
Kendo UI Fx 提供了一个丰富,可扩展,性能经过优化的工具集合用来完成HTML元素的过渡显示.每种特效近可能的使用CSS Transition ,对于一些老版本浏览器使用修改属性的方法作为补充 ...
- Android ListView中添加不同的多种布局
最近做项目要使用ListView加载不同的布局,由于自己写的代码不能贴出,故找了一篇自认为比较好的blog给分享出来,希望对用到此项技术的同学有点帮助. http://logc.at/2011/10/ ...
- struts2对ognl表达式的使用(配图解加讲解)
ognl它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对Java对象图进行导航. 先看一张示意图 如果是下面的除了第一种valueStack的下面几 ...
- 当你在试衣间试衣服,请你务必想起wait()与notify()
在学习多线程的时候,你无法逃避sleep.wait.notify.notifyAll的关键字,我们肯定是对sleep用的最多,即使你写个Demo也要经常用到Thread.sleep(xxx)模拟等待的 ...
- 【原】tinker dex文件格式的dump工具tinker-dex-dump
序言 Tinker是微信推出的热更新开源项目,同其它热更新方案相比具有补丁包小,支持类,so,资源文件的替换等优点.其中在类替换的方案里自主研发了DexDiff算法,使得补丁包变的更小.DexDiff ...
- redis 学习笔记——redis集群
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...