转载请注明出处: http://blog.csdn.net/qq_26525215
本文源自【大学之旅_谙忆的博客】

这个稍微比上个版本做得完善了一点,用了JavaBean来封装用户信息,添加了一个管理踢用户的功能。
上一个的用户访问量是通过监听request来统计的,在这个实例中,我们也可以通过过滤器来实现统计网站访问量。

直接看源码吧,感觉没多少要讲的,我习惯把解释写在代码中。

部分源码

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>在线人信息管理与统计</title>
</head><body><h2>在线人信息管理与统计</h2><c:if test="${empty sessionScope.user}" var="boo"><h3>会员登录:</h3><form action='<c:url value='/LoginServlet'></c:url>' method="post">姓名:<input type='text' name="name"><br /> <input type="submit"value="注册"></form></c:if><c:if test="${!boo}">亲爱的${user.name}<c:if test="${user.admin}" var="bo">-管理员</c:if><c:if test="${!bo}">-会员</c:if>,欢迎来到...<br /></c:if><br /><a href="<c:url value='/servlet/ShowServlet'/>">显示所有在线用户</a><br /><a href="<c:url value='/servlet/LogOutServlet'/>">安全退出</a><br/>网站访问量:${count}</body>
</html>

MyServletContextListener

这个就是实现把访问量持久化的监听器实现类:

package cn.hncu.listeners;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyServletContextListener implements ServletContextListener{@Overridepublic void contextInitialized(ServletContextEvent sce) {//从服务器硬盘把之前存储的点击量数据读取出来ServletContext sct = sce.getServletContext();String path = sct.getRealPath("/count.txt");try {BufferedReader br = new BufferedReader(new FileReader(path));String line = br.readLine();Integer count = Integer.valueOf(line);sct.setAttribute("count", count);} catch (Exception e) {//如果出异常了,我们认为文件还不存在,服务器第一次启动e.printStackTrace();sct.setAttribute("count",new Integer(0));}}//关闭服务器时@Overridepublic void contextDestroyed(ServletContextEvent sce) {//把当前servletContext容器中存储的点击量数据 永久化到  服务器硬盘ServletContext sct = sce.getServletContext();String path = sct.getRealPath("/count.txt");try {PrintWriter pw = new PrintWriter(path);pw.write(""+sct.getAttribute("count"));pw.close();} catch (FileNotFoundException e) {e.printStackTrace();}}}

CharsetFilter

实现统计访问量和全站编码的过滤器

package cn.hncu.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;public class CharsetFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");response.setCharacterEncoding("utf-8");//获取该用户的ip,存储到它的session对象中HttpServletRequest req = (HttpServletRequest) request;if(req.getSession().getAttribute("ip")==null){req.getSession().setAttribute("ip", req.getRemoteAddr());//这里的req和request是同一个对象!!!//所以传过去的参数还可以是request}//new一个线程统计访问量new MyThread(request.getServletContext()).start();//放行chain.doFilter(request, response);}@Overridepublic void destroy() {}
}class MyThread extends Thread{private ServletContext servletContext =null;private static Object boj = new Object();public MyThread(ServletContext servletContext) {this.servletContext = servletContext;}@Overridepublic void run() {synchronized (boj) {servletContext.setAttribute("count",(Integer)servletContext.getAttribute("count")+1);}}}

LoginFilter

用户访问其他页面时进行的权限过滤:

如果你没有登陆,就不给你权限去访问除主页外的其他页面。

package cn.hncu.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;if(req.getSession().getAttribute("user")==null){HttpServletResponse resp = (HttpServletResponse) response;resp.sendRedirect(req.getContextPath()+"/index.jsp");}else{//放行chain.doFilter(request, response);}}@Overridepublic void destroy() {}}

MySessionListener

有用户来访问时,我们就通过监听器去监听session的创建与销毁,在这里,我们认为一个session就是一个用户!

package cn.hncu.listeners;import java.util.Collections;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;public class MySessionListener implements HttpSessionListener{@Overridepublic void sessionCreated(HttpSessionEvent se) {Map<String, HttpSession> onLines = (Map<String, HttpSession>) se.getSession().getServletContext().getAttribute("onLines");if(onLines==null){//第一个来访问的onLines = Collections.synchronizedMap(new HashMap<String, HttpSession>() );//使用同步技术的Mapse.getSession().getServletContext().setAttribute("onLines", onLines);}onLines.put(se.getSession().getId(), se.getSession());}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {Map<String, HttpSession> onLines = (Map<String, HttpSession>) se.getSession().getServletContext().getAttribute("onLines");//这里也要防范好!多线程,多个管理同时踢一个人的时候,如果不防范就会出问题if(onLines.containsKey( se.getSession().getId() )){onLines.remove( se.getSession().getId() );}}}

LoginServlet

用于判断用户登录与设置管理员的servlet。

package cn.hncu.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import cn.hncu.domain.User;public class LoginServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String name = request.getParameter("name");if(name!=null && name.trim().length()>0){User user = new User();user.setName(name);//用user作为参数到后台登录,这里我们简化了,直接假设登录成功if(true){Random r = new Random();int a = r.nextInt(2);if(a%2==0){user.setAdmin(true);}else{user.setAdmin(false);}}request.getSession().setAttribute("user", user);}response.sendRedirect(request.getContextPath()+"/index.jsp");}}

LogOutServlet

用于用户的安全退出!

package cn.hncu.servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LogOutServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//用户安全退出很简单,我们在服务器端移除用户的session就可以了request.getSession().invalidate();response.sendRedirect(request.getContextPath()+"/index.jsp");}
}

ShowServlet

显示所有用户信息时的servlet,需要把信息全部封装到request这个容器中,再转发到前台jsp显示的页面。

package cn.hncu.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class ShowServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Map<String, HttpSession> onLines = (Map<String, HttpSession>) getServletContext().getAttribute("onLines"); List<Map<String, Object>> lists = new ArrayList<Map<String,Object>>();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//遍历onlines,针对每个session对象封装一个map(信息包含:name,createTime,lastAccessTime,ip),把该map添加到list当中Iterator<Entry<String, HttpSession>> it = onLines.entrySet().iterator();while(it.hasNext()){Entry<String, HttpSession> en = it.next();Map<String, Object> m = new HashMap<String, Object>();m.put("id", en.getValue().getId() );m.put("user", en.getValue().getAttribute("user"));String creationTime = sdf.format(new Date(en.getValue().getCreationTime()));m.put("creationTime", creationTime);String lastAccessTime = sdf.format( new Date(en.getValue().getLastAccessedTime()) );m.put("lastAccessTime", lastAccessTime);//注意,该ip数据是在CharsetFilter中封装的m.put("ip", en.getValue().getAttribute("ip"));lists.add(m);}request.setAttribute("onLines", lists);request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);}
}

show.jsp

前台在线用户的显示页面,会员和管理员看到的页面是不同的,管理员可以踢人。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>在线人信息管理</title><style type="text/css">table{border: 1px solid red;border-collapse: collapse;/*设置单线-线合并*/width: 80%;}td{border: 1px solid red;padding:3px;}.header{background: gray;}</style></head><body><h2>以下是所有在线用户信息</h2>   <table><tr class="header" ><td>姓名</td>  <td>上线时间</td>  <td>最后访问时间</td> <td>IP</td> <td>操作</td></tr><c:forEach items="${requestScope.onLines}" var="map"><tr><td><c:if test="${empty map.user}" var="boo">游客                  </c:if><c:if test="${!boo}">${map.user.name}</c:if></td><td>${map.creationTime}  </td><td>${map.lastAccessTime}</td><td>${map.ip }           </td><td><c:if test="${!boo&&user.admin}"><a href="<c:url value='/servlet/KickOutServlet?id=${map.id}'/> " >踢出${map.user.name}</a></c:if></td></tr></c:forEach></table><br/>网站访问量:${count}</body>
</html>

KickOutServlet

管理踢人时请求的servlet,在这里我们把被踢的人的session从服务器端移除就可以了。但是注意防范一下,那个被踢者是否已经被踢走了、

package cn.hncu.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class KickOutServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();String id = request.getParameter("id");Map<String, HttpSession> onLines = (Map<String, HttpSession>) getServletContext().getAttribute("onLines");if(onLines.containsKey(id)){HttpSession session = onLines.get(id);//得到该sessionsession.invalidate();//移除该sessionout.println("该用户已被踢出!");}else{out.println("该用户已经不存在!");}}
}

user

JavaBean,在这里,我就是简单的封装了一个JavaBean使用了。我们的知识点并不是这里。

package cn.hncu.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class KickOutServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();String id = request.getParameter("id");Map<String, HttpSession> onLines = (Map<String, HttpSession>) getServletContext().getAttribute("onLines");if(onLines.containsKey(id)){HttpSession session = onLines.get(id);//得到该sessionsession.invalidate();//移除该sessionout.println("该用户已被踢出!");}else{out.println("该用户已经不存在!");}}
}

web.xml

注意啊!无论是servlet还是监听器,过滤器!一定要记得配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><display-name></display-name> <listener><listener-class>cn.hncu.listeners.MyServletContextListener</listener-class></listener><listener><listener-class>cn.hncu.listeners.MySessionListener</listener-class></listener><servlet><servlet-name>LoginServlet</servlet-name><servlet-class>cn.hncu.servlet.LoginServlet</servlet-class></servlet><servlet><servlet-name>LogOutServlet</servlet-name><servlet-class>cn.hncu.servlet.LogOutServlet</servlet-class></servlet><servlet><servlet-name>ShowServlet</servlet-name><servlet-class>cn.hncu.servlet.ShowServlet</servlet-class></servlet><servlet><servlet-name>KickOutServlet</servlet-name><servlet-class>cn.hncu.servlet.KickOutServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/LoginServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>LogOutServlet</servlet-name><url-pattern>/servlet/LogOutServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ShowServlet</servlet-name><url-pattern>/servlet/ShowServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>KickOutServlet</servlet-name><url-pattern>/servlet/KickOutServlet</url-pattern></servlet-mapping><filter><filter-name>charset</filter-name><filter-class>cn.hncu.filter.CharsetFilter</filter-class></filter><filter><filter-name>login</filter-name><filter-class>cn.hncu.filter.LoginFilter</filter-class></filter><filter-mapping><filter-name>login</filter-name><url-pattern>/servlet/*</url-pattern><url-pattern>/jsps/*</url-pattern></filter-mapping><filter-mapping><filter-name>charset</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

演示结果:

登录之前显示的主页:

未登录的时候,是无法进入显示所有在线用户的,用过滤器拦截了。

登录之后显示的主页:

管理员登录后显示的在线人信息

如果不是管理员登录后,最后的操作时不会显示的。

完整的项目链接:

https://github.com/chenhaoxiang/Java/tree/master/myOnlinesWeb2

myOnlinesWeb2.zip压缩文件

希望本篇博客对大家有一点用(^-^)

转载请注明出处: http://blog.csdn.net/qq_26525215
本文源自【大学之旅_谙忆的博客】

JavaWeb-网站在线用户信息、网站访问量以及管理踢出用户实例相关推荐

  1. javaweb JSP JAVA旅游网站在线旅游信息网站(旅游系统旅游网站)jsp旅游管理系统

    常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查看,在线招标房,屋租赁,教务管理,医院管理,餐厅收银,来访咨询,兼职论坛,桌面聊天室,酒店管理,民宿管理,车位租赁,音 ...

  2. C#语言 Asp.net旅游网站在线旅游信息网站(旅游系统旅游网站)旅游管理系统旅游景区旅游网站

  3. 基于JSP 旅游网站在线旅游信息网站(Java旅游系统旅游网站)旅游管理系统jsp旅游景区旅游网站

  4. 用redis+jwt保存在线用户和获得在线用户列表、踢出用户示例

    文章目录 redis工具类 用户实体类 token配置 service层保存和查询在线用户 工具类 获得用户浏览器等其他信息 controller层 redis工具类 import org.sprin ...

  5. TCP多人聊天程序Java实现(群聊,私聊,在线用户,踢出用户)

    本程序在程序 https://blog.csdn.net/joffy/article/details/18079331 的基础是上添加了私聊,踢出用户两个功能. 由客户端和服务器端构成程序,程序借助J ...

  6. mybatis练习-获取拥有“普通用户”角色的所有用户信息,要求查询结果除了包含用户自身信息,还包括角色名和角色创建时间。

    实现要求: 获取拥有"普通用户"角色的所有用户信息,要求查询结果除了包含用户自身信息,还包括角色名和角色创建时间. 实现思路: 在用户实体类SysUser中新增角色SysRole成 ...

  7. spring boot + shiro 实现登陆 踢出用户功能 (挤人) 以及UnknownSessionException异常问题 记住我功能

    简介:踢出用户功能:就是限制一个账号登陆人数. 本文限定一个账号一个用户登陆,并且是挤掉前一个用户 目录 首先 pom 然后Shiro配置Bean  ShiroConfigBean 然后配置 Shir ...

  8. linux强制踢出用户,Linux下管理员强行踢出用户的命令使用方法

    Linux强制踢出用户命令: 一.输入w命令查看已登录用户信息 [root@KW_S01_192.168.1.106_A ~]# w 19:22:31 up  2:11,  3 users,  loa ...

  9. shiro 删除用户session_我的shiro之旅: 十二 shiro 踢出用户(同一用户只能一处登录)...

    看了一下官网,没有找到关于如何控制同一用户只能一处登录的介绍,网上也没有找到相关的文章.可能有些人会记录用户的登录信息,然后达到踢出用户的效果.这里介绍一个更简单的方法. 如果我们跟shiro的源码, ...

最新文章

  1. LeetCode 94. Binary Tree Inorder Traversal--二叉树中序遍历--递归,迭代--C++,Python解法
  2. 诺基亚发布首款高功率小基站SCORE以及Flexi Zone LWA支持能力
  3. Openstack组建部署 — Environment of Controller Node
  4. c++ ifstream 文件不结束_C++核心编程 第十二节 文件操作
  5. 16进制字符串转化为10进制数
  6. ajax获取session值_java程序员你真的了解session与cookie吗?
  7. php密码重复,AngularJs验证重复密码的方法(两种)
  8. PS2251-07 海力士(金士顿U盘量产,成功!)
  9. idea apollo启动VM参数设置
  10. 新手入坑自动驾驶,我是这么学习的......
  11. laravel路由不生效,404,除了/ 都不行,关于nginx环境下laravel除了默认路由都出现404报错的处理方法...
  12. Windows窗体编程基础学习:更改TabControl 的外观(如qq用的)
  13. 魔兽世界怀旧服服务器显示配置,魔兽世界怀旧服配置要求很高吗 魔兽世界怀旧服电脑最低配置要求...
  14. 【详解】P问题、NP问题和NPC问题详解(千禧年问题之首)
  15. 巧得int(4字节)最大最小值
  16. 爬豆瓣读书Top250
  17. windows10 给指定扩展名扩展名添加右键菜单
  18. Nginx神来之笔,提高并发原来如此简单
  19. etal斜体吗 参考文献_参考文献方面毕业论文格式模板,与文下载****北京化工大学学报相关论文下载...
  20. 火车头采集细节(一)

热门文章

  1. 车辆贷款违约预测挑战赛
  2. excel函数SUMPRODUCT
  3. 使用sqlite3解决IDEA中SVN更新提示cleanup却无法cleanup的问题
  4. 无线路由器的使用方法
  5. Python基础(9)水仙花数
  6. 【bzoj1511】[POI2006]OKR-Periods of Words KMP-next数组
  7. 注解图Annotation
  8. wxWidgets搜索事件处理函数顺序
  9. HDU 1425 sort(堆排序)
  10. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java