javaee 使用监听器统计当前在线用户列表

news2024/11/18 11:32:42

在这里插入图片描述在这里插入图片描述
ServletContextListener 和 HttpSessionBindingListener 需要配和使用

TestServletContextListener

package com.yyy.listener;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.yyy.po.Users;

/**
 * Application Lifecycle Listener implementation class TestServletContextListener
 *
 */
@WebListener
public class TestServletContextListener implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public TestServletContextListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    	System.out.println("服务器关闭了");
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    	// TODO Auto-generated method stub
    			//初始化数据 变量  数据库连接信息  连接池的信息
    			ServletContext application=  arg0.getServletContext();
    			
    			application.setAttribute("count", 0);
    			
    			//存放所有登录的用户
    			List<Users> onLineUserList=new ArrayList<Users>();
    			
    			application.setAttribute("onLineUserList", onLineUserList);
    			
    			
    			System.out.println("服务器启动了");
    }
	
}

TestHttpSessionBindingListener

package com.yyy.listener;

import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

import com.yyy.po.Users;

/**
 * Application Lifecycle Listener implementation class TestHttpSessionBindingListener
 *
 */
@WebListener
public class TestHttpSessionBindingListener implements HttpSessionBindingListener {
	private Users user;
	private List<Users> onLineUserList;
    /**
     * Default constructor. 
     */
	public TestHttpSessionBindingListener() {
        // TODO Auto-generated constructor stub
    }
    public TestHttpSessionBindingListener(Users user) {
    	this.user=user;
        // TODO Auto-generated constructor stub
    }
    public boolean isUserExists()
	{
		for(Users myuser:onLineUserList)
		{
			if(myuser.getUname().equals(user.getUname()))
				return true;
		}
		
		return false;
	}
    public void printUserList()
	{
		 System.out.println("当前用户列表:");
		 for(Users user:onLineUserList)
		 {
			 System.out.println(user.getUname());
		 }
	}

	/**
     * @see HttpSessionBindingListener#valueBound(HttpSessionBindingEvent)
     */
    @Override
    public void valueBound(HttpSessionBindingEvent arg0)  { 
         // TODO Auto-generated method stub
    	// TODO Auto-generated method stub
    			ServletContext application= arg0.getSession().getServletContext();
    			onLineUserList=  (List<Users>) application.getAttribute("onLineUserList");
    			
    			//判断当前用户是否在用户列表中,不存在  则添加到在线列表中		
    			if(!isUserExists())
    			{
    				onLineUserList.add(user);
    				
    				System.out.println("用户:"+user.getUname()+"上线了");
    				
    				//存回到application变量
    				application.setAttribute("onLineUserList", onLineUserList);
    				
    				//打印用户列表
    				printUserList();
    			}
    }

	/**
     * @see HttpSessionBindingListener#valueUnbound(HttpSessionBindingEvent)
     */
    @Override
	public void valueUnbound(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		ServletContext application= arg0.getSession().getServletContext();
		if(isUserExists())
		{
			onLineUserList.remove(user);
			
			System.out.println("用户:"+user.getUname()+"下线了");
			
			//存回到application变量
			application.setAttribute("onLineUserList", onLineUserList);
			
			//打印用户列表
			printUserList();
		}
		
	}
	
}

LoginServlet

package com.yyy.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

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 javax.servlet.http.HttpSession;

import com.yyy.listener.TestHttpSessionBindingListener;
import com.yyy.po.Users;
import com.yyy.util.DbHelper;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
				//response.getWriter().append("Served at: ").append(request.getContextPath());
			
				//获得用户信息
				String uname=request.getParameter("uname");
				String pwd=request.getParameter("pwd");
				//判断是否登录成功
				String sql="select * from user where uname=? && upwd=?";
				List<Object> paramList=new ArrayList<Object>();
				paramList.add(uname);
				paramList.add(pwd);	
				DbHelper dbHelper=new DbHelper();
				List<Map<String, Object>> map=  dbHelper.executeQuery(sql, paramList);
				if(map!=null && map.size()>0)
				{
				   
					
						Users user=new Users();
						user.setUname(uname);
						user.setUpwd(pwd);
						//登录成功
						//创建一个HttpSessionBindingListener对象用来监听当前用户
						TestHttpSessionBindingListener httpSessionBingingListener=new TestHttpSessionBindingListener(user);
					
						HttpSession session=request.getSession();
						
						session.setAttribute("user", httpSessionBingingListener);
						
					
						response.sendRedirect("index.jsp");
					
				}
				else
					response.getWriter().println("用户名或密码出错");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复现论文ChineseBERT(ONTONOTES数据集)

记录一下自己复现论文《ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information》的过程&#xff0c;最近感觉老在调包&#xff0c;一天下来感觉什么也没干&#xff0c;就直播记录一下跑模型的过程吧 事前说明&#xff0c;这是跑项目的实况&#xff0c;如…

实用类详解

第二章 实用类介绍 目录 第二章 实用类介绍 1.枚举 2.包装类及其构造方法 3.Math类 4.Random类 5.String类 总结 内容仅供学习交流&#xff0c;如有问题请留言或私信&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 有空您就点点赞 1.枚举 枚举指由一…

python-注册nacos服务

一、首页 Nacos&#xff08;Naming and Configuration Service&#xff09;是一个用于实现服务注册和发现的开源项目。Nacos注册服务的主要作用是帮助微服务架构中的各个服务实例进行注册和发现&#xff0c;以便于服务之间的通信和协作&#xff0c;另外&#xff0c;也可以在nac…

基于高性能的STM32G031K4T6、STM32G031K6T6、STM32G031K8T6(ARM微控制器)64MHz 闪存 32-LQFP

STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用&#xff0c;并可随时用于物联网 (IoT) 解决方案。这些微控制器具有很高的集成度&#xff0c;基于高性能ARM Cortex-M0 32位RISC内核&#xff0c;工作频率高达64MHz。该器件包含内存保护单元 (MPU)、高速嵌入式内…

大数据赋能交通业务管理——远眺智慧交通集成管控系统

随着交通管理需求的不断提升&#xff0c;原有系统管理模式的缺点逐渐显露&#xff0c;各业务系统的相互独立、各自为战&#xff0c;成为交通管理人员全局把控交通资源、实现交通综合管控的壁垒。 智慧交通集成管控平台通过统一标准&#xff0c;集成交警各类业务系统、整合相关数…

libevent(6)windows上使用iocp网络模型

windows操作系统上不能使用epoll模型&#xff0c;只能使用iocp网络模型。这里我把怎么在windows上使用iocp的代码直接贴上&#xff1a; #include <iostream> #include <signal.h> #include <event2/event.h> #include <event2/listener.h> #include &l…

【Linux从入门到放弃】冯诺依曼体系机构、操作系统及管理的本质

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《Linux从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 文…

技术小知识:WAN和LAN区别 ①

1、WAN是外网接接入入口&#xff0c;一般指&#xff1a;外网&#xff0c;广域网&#xff0c;公网。 2、LAN是局域网输出接口&#xff0c;一般指&#xff1a;内网&#xff0c;家庭公司局域网。 局域网是小规模&#xff0c;近距离的一种内部范围网络布局。 外网要跨越的通讯商中…

【GESP】2023年06月图形化一级 -- 去旅行

文章目录 去旅行1. 准备工作2. 功能实现3. 设计思路与实现&#xff08;1&#xff09;角色、舞台背景设置a. 角色设置b. 舞台背景设置 &#xff08;2&#xff09;脚本编写a. 角色&#xff1a;Avery Walking 4. 评分标准 去旅行 1. 准备工作 &#xff08;1&#xff09;删除默认小…

不要错过这所211,专业课简单!保护一志愿,人称电力黄埔军校!

一、学校及专业介绍 华北电力大学&#xff08;North China Electric Power University&#xff09;&#xff0c;简称华电&#xff08;NCEPU&#xff09;&#xff0c;是中华人民共和国教育部直属、由国家电网有限公司等12家特大型电力集团和中国电力企业联合会组成的理事会与教育…

Java容器介绍及其操作方法

一、List ArrayList&#xff0c;LinkedList 特有的函数 <class T> get(int index) 获取下标为index的元素 <class T> set(int index, <class T> element) 改变某个元素 void add(int index, <class T> element) 在下标为index处插入元素…

API信息

API 接口渗透测试

Neo4j的简单使用

1、创建节点 CREATE (:Person {name: Alice, age: 25, city: London}) CREATE (:Person {name: Bob, age: 30, city: New York}) CREATE (:Person {name: Charlie, age: 35, city: Paris})CREATE (:Interest {name: Music}) CREATE (:Interest {name: Sports}) CREATE (:Inter…

Redis实战案例9-封装Redis工具类

1. 封装Redis工具类 方法一和三主要解决缓存穿透的问题&#xff1b; 方法二和四主要解决缓存击穿的问题&#xff1b; 2. 方法一和三 缓存穿透的封装&#xff1b; private final StringRedisTemplate stringRedisTemplate; public CacheClient(StringRedisTemplate stringRedisT…

炫技亮点 Spring Websocket idle check原理

文章目录 原理配置附件Java_websocket空闲检测原理 Spring Websocket 是基于 WebSocket 协议的实现&#xff0c;它提供了一种在客户端和服务器之间实时双向通信的方式。其中&#xff0c;idle check&#xff08;空闲检查&#xff09;是一种机制&#xff0c;用于检测 WebSocket 连…

新项目,不妨采用这种架构分层,很优雅!

大家好&#xff0c;我是飘渺。今天继续更新DDD&微服务的系列文章。 在专栏开篇提到过DDD&#xff08;Domain-Driven Design&#xff0c;领域驱动设计&#xff09;学习起来较为复杂&#xff0c;一方面因为其自身涉及的概念颇多&#xff0c;另一方面&#xff0c;我们往往缺乏…

CF449D Jzzhu and Numbers 题解

题意 给定 A 1 . . . . A n A_1....A_n A1​....An​&#xff0c;选任意个数使得它们异或和为 0 0 0&#xff0c;求方案数。 思路 很朴素的想法是枚举每个数&#xff0c;然后进行 0-1 背包方案数统计&#xff0c;时间复杂度 O ( n n ) O(n \times n) O(nn)。 而根据前面几…

linux——解压和压缩

目录 1.压缩格式 2. tar命令 3.tar命令压缩 4. tar解压 5. zip命令压缩文件 6. unzip 命令解压 7. 总结 1.压缩格式 2. tar命令 3.tar命令压缩 4. tar解压 5. zip命令压缩文件 6. unzip 命令解压 7. 总结

DragGAN windows 部署逼坑指南

可参看B站视频&#xff1a;【DragGAN开源】DragGAN win11 部署逼坑指南_哔哩哔哩_bilibili 报错信息如下&#xff1a; Setting up PyTorch plugin "bias_act_plugin"... Failed! ninja is required to load c extensions 环境配置&#xff1a; cuda:12.1visual …

C++vector动态容器类

1、std::vector::push_back&#xff08;尾差&#xff09; 1.1、std::vector::operator[] 意思为&#xff1b; 访问元素 返回对vector容器中位置n的元素的引用。 void test_vector2() {vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);/…