HttpsessionListener 实现在线人数统计
最近在学servlet jsp,用的林信良先生的 jsp&servlet 这本书,在第五章有道在线人数统计的课后题完成,做一次记录.
实际效果:
一:用户类:
package cc.openhome.controler; public class User {
private String name;
private String sessionId;
private String ip;
private String firstTime;
private String userAgent;
public User(){ } public String getName() {
return name;
} public String getIp() {
return ip;
} public String getSessionId() {
return sessionId;
} public String getFirstTime() {
return firstTime;
} public String getUserAgent() {
return userAgent;
} public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
} public void setName(String name) {
this.name = name;
} public void setFirstTime(String firstTime) {
this.firstTime = firstTime;
} public void setIp(String ip) {
this.ip = ip;
} public void setSessionId(String sessionId) {
this.sessionId = sessionId;
} }
public class User
二:登录页面:
package cc.openhome.controler; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*; @WebServlet("/login.do")
public class Login extends HttpServlet { private ArrayList<User> ulist;
private Map<String,String> users;
public Login(){
users = new HashMap<String,String>();
users.put("liming","123456");
users.put("小猪","123456");
users.put("小林","123456");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8");
String uname = req.getParameter("user");
String pssd = req.getParameter("pwd"); String page = "login.html"; if (users.containsKey(uname) && users.get(uname).equals(pssd)) {
req.getSession().setAttribute("uname", uname);
String sessionId = req.getSession().getId();
ArrayList<User> ulist = (ArrayList<User>) getServletContext().getAttribute("ulist");
if(ulist == null){
ulist = new ArrayList<User>();
getServletContext().setAttribute("ulist",ulist);
}
User u = new User();
u.setSessionId(sessionId);
u.setName(uname);
u.setIp(req.getRemoteAddr());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");
u.setFirstTime(df.format(new Date()));
u.setUserAgent(req.getHeader("user-agent"));
ulist.add(u);
page = "welcome.view";
}
resp.sendRedirect(page);
}
}
三:统计在线人数:
package cc.openhome.controler; import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.List; @WebListener
public class OnlineUserCounter implements HttpSessionListener {
private static int counter; public static int getCounter(){
return counter;
} @Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("新建session: "+se.getSession().getId()); } @Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
ServletContext application = session.getServletContext();
String username = (String) session.getAttribute("username"); List ulist = (List)
application.getAttribute("ulist");
ulist.remove(username);
System.out.println(username+"已经退出!"); }
}
四:登录成功页面显示
package cc.openhome.view; import cc.openhome.controler.User;
import cc.openhome.controler.OnlineUserCounter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; @WebServlet("/welcome.view")
public class Welcome extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession(false);
out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01'" +
"Transitional//EN");
out.println("<html>");
out.println("<head>");
out.println("<title>欢迎</title>");
out.println("</head>");
out.println("<body>"); ArrayList<User> ul = (ArrayList <User>) getServletContext().getAttribute("ulist");
out.println("<h1> 目前在线人数 "+ ul.size() +"人</h1>");
Iterator<User> it = ul.iterator();
while (it.hasNext()){
User u = it.next();
out.println("<h4>id: "+ u.getSessionId() +" </h4>");
out.println("<h4>用户: "+ u.getName()+" </h4>");
out.println("<h4>ip: "+ u.getIp() +" </h4>");
out.println("<h4>访问时间: "+ u.getFirstTime() +" </h4>");
out.println("<h4>浏览器信息: "+ u.getUserAgent() +" </h4>");
out.println("<br>");
} out.println("</body>");
out.println("</html>");
out.close(); }
}
五:登录的前端页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="login.do" method="post">
用户名: <input type="text" name="user"><br>
密码: <input type="password" name="pwd"><br>
提交: <input type= "submit">
</form>
</body>
</html>
longin.html
六:实际效果:
七:总结
1.httpsessionListener 工作机制
2,ArrayList 使用
八:不足之处:
1页面展示用的是:在servlet中用的html,还没有学习jsp.
2.已知问题:同一个用户同时登录,重新显示为一新用户,后面再改
参考资料:
http://www.cnblogs.com/shencheng/archive/2011/01/07/1930227.html
https://blog.csdn.net/su20145104009/article/details/53217201
本人菜鸟一枚,如有问题请大神不吝赐教!
HttpsessionListener 实现在线人数统计的更多相关文章
- 用HttpSessionListener与HttpSessionBindingListener实现在线人数统计
在线人数统计方面的实现,最初我的想法是,管理session,如果session销毁了就减少,如果登陆用户了就新增一个,但是如果是用户非法退出,如:未注销,关闭浏览器等,这个用户的session是管理不 ...
- [转]用HttpSessionListener与HttpSessionBindingListener实现在线人数统计
原文链接:http://www.cnblogs.com/shencheng/archive/2011/01/07/1930227.html 下午比较闲(其实今天都很闲),想了一下在线人数统计方面的实现 ...
- 在线人数统计session管理
下午比较闲(其实今天都很闲),想了一下在线人数统计方面的实现,上网找了下这方面的知识,最初我的想法是,管理session,如果session销毁了就减少,如果登陆用户了就新增一个,但是如果是用户非法退 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 系列目录 上次的探讨没有任何结果,我浏览了大量的文章 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨 系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可 ...
- JavaWeb学习记录(二十六)——在线人数统计HttpSessionListener监听实现
一.session销毁控制层代码 public class InvalidateSession extends HttpServlet { public void doGet(HttpServletR ...
- servlet监听器实现在线人数统计
一.准备知识 servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. filter:fi ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(39)-在线人数统计探讨
系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可以确实的统计在线用户! Discuz!NT 在线用户功能算是做得比较好的!参考资料 他的原理大致是根据用户的操作间隔来确 ...
- javaweb中实现在线人数统计
session并不是浏览器关闭时销毁的,而是在session失效的时候销毁下列代码就是监测session创建.销毁 package com.my.count; import javax.servlet ...
随机推荐
- 与图论的邂逅01:树的直径&基环树&单调队列
树的直径 定义:树中最远的两个节点之间的距离被称为树的直径. 怎么求呢?有两种官方的算法(不要问官方指谁我也不晓得): 1.两次搜索.首先任选一个点,从它开始搜索,找到离它最远的节点x.然后从x开始 ...
- Go 初体验 - 令人惊叹的语法 - defer.2 - 如何提前执行?
上一文中讲到 defer 会在宿主函数 return 之前调用,那么我们就是想在宿主函数执行到中间调用,怎么办呢? 1. 改变宿主函数逻辑,分成多个函数,需要的那个函数里 defer . 2. 使用匿 ...
- 再解炸弹人,dfs&bfs
输入样例: 13 13 3 3##############GG.GGG#GGG.####.#G#G#G#G##.......#..G##G#.###.#G#G##GG.GGG.#.GG##G#.#G# ...
- sublime开启vim模式
sublime自带vim模式Vintage,只是默认是ignore状态,因此如果按Esc键没有进入vim模式,只需要按ctrl+shift+P进入命令模式,键入Enable package,输入Vim ...
- JS用斜率判断鼠标进入DIV四个方向的方法 判断鼠标移入方向
本文要介绍的是一种鼠标从一个元素移入移出时,获取鼠标移动方向的思路.这个方法可以帮助你判断鼠标在移入移出时,是从上下左右的哪个方向发生的.这个思路,是我自己琢磨出来,利用了一点曾经高中学过的数学知识, ...
- 剑指offer(18)二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- HTTP的简单的解析
HTTP 中文全称为超文本传输协议是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途 ...
- 单元测试系列之三:JUnit单元测试规范
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6762032.html Junit测试代 ...
- js 数组的拷贝
在js中,数组Array是引用类型,直接将数组赋值给一个变量名,二者所指向的地址是一样的. 所以直接复制数组会产生意想不到的结构. 要想解决拷贝一个数组但是对副本的修改不影响原来的数组,有以下方式: ...
- js同步、异步、回调的执行顺序以及闭包的理解
首先,记住同步第一.异步第二.回调最末的口诀 公式表达:同步=>异步=>回调 看一道经典的面试题: for (var i = 0; i < 5; i++) { setTimeout( ...