最近在学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 实现在线人数统计的更多相关文章

  1. 用HttpSessionListener与HttpSessionBindingListener实现在线人数统计

    在线人数统计方面的实现,最初我的想法是,管理session,如果session销毁了就减少,如果登陆用户了就新增一个,但是如果是用户非法退出,如:未注销,关闭浏览器等,这个用户的session是管理不 ...

  2. [转]用HttpSessionListener与HttpSessionBindingListener实现在线人数统计

    原文链接:http://www.cnblogs.com/shencheng/archive/2011/01/07/1930227.html 下午比较闲(其实今天都很闲),想了一下在线人数统计方面的实现 ...

  3. 在线人数统计session管理

    下午比较闲(其实今天都很闲),想了一下在线人数统计方面的实现,上网找了下这方面的知识,最初我的想法是,管理session,如果session销毁了就减少,如果登陆用户了就新增一个,但是如果是用户非法退 ...

  4. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 系列目录 上次的探讨没有任何结果,我浏览了大量的文章 ...

  5. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨 系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可 ...

  6. JavaWeb学习记录(二十六)——在线人数统计HttpSessionListener监听实现

    一.session销毁控制层代码 public class InvalidateSession extends HttpServlet { public void doGet(HttpServletR ...

  7. servlet监听器实现在线人数统计

    一.准备知识 servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. filter:fi ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(39)-在线人数统计探讨

    系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可以确实的统计在线用户! Discuz!NT 在线用户功能算是做得比较好的!参考资料 他的原理大致是根据用户的操作间隔来确 ...

  9. javaweb中实现在线人数统计

    session并不是浏览器关闭时销毁的,而是在session失效的时候销毁下列代码就是监测session创建.销毁 package com.my.count; import javax.servlet ...

随机推荐

  1. eclispe集成Scalas环境后,导入外部Spark包报错:object apache is not a member of package org

    在Eclipse中集成scala环境后,发现导入的Spark包报错,提示是:object apache is not a member of package org,网上说了一大推,其实问题很简单: ...

  2. linux----------linux的scp命令介绍

    1.scp是有Security的文件copy,基于ssh登录. 命令基本格式: scp [OPTIONS] file_source file_target OPTIONS: -v 和大多数 linux ...

  3. IO流的总结(二)

    缓冲字节流: 我们先说一下缓存区的概念: 缓冲区就好比一辆车,一车一车的把数据拉走,这样就效率快多了 按照流的方向分类: 写入数据到流中,字节缓冲输出流 BufferedOutputStream 读取 ...

  4. Python记录12:迭代器+生成器+生成式

    '''1. 什么是迭代器 什么是迭代:迭代就是一个重复的过程,但是每一次重复都是基于上一次的结果而进行的 单纯的重复不是迭代: while True: print(1) 迭代的过程 l=['a','b ...

  5. wingIDE Pro6 破解教程

    亲测wingIDE pro6.0.6-1激活成功 算号器下载 激活的时候选择第三项 打开算号器,获得license id 把算号器里的license id输入到第一步的输入框里 continue得到r ...

  6. sql 小技巧

    declare @pids varchar(max)='' ),pid)+','+@pids from product where pname like '%red%' select @pids

  7. Sitecore开发 IP地理定位服务入门

    如果您是营销人员或开发人员,并且有兴趣在Sitecore安装中使用Sitecore IP Geolocation服务,那么本文就是为您准备的. 借助Sitecore IP地理定位服务,您网站的访问者可 ...

  8. [openjudge-动态规划]Maximum sum

    题目描述 题目原文 描述 Given a set of n integers: A={a1, a2,-, an}, we define a function d(A) as below: d(A)=m ...

  9. P1605 迷宫

    P1605 迷宫 这是一道毒瘤题... 这是一道广搜题 bfs ... 代码: #include<cstdio> #include<iostream> #include< ...

  10. LSTMs 长短期记忆网络系列

    RNN的长期依赖问题 什么是长期依赖? 长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响,是RNN中无法解决的一个问题. 如果从(1) “ 这块冰糖味道真?”来预测下一个词,是很容易得出“ ...