Servlet监听在线用户

本文介绍了一个基于Java的在线用户监听器实现方案,通过监听HTTP会话事件来维护一个在线用户列表。当用户登录时,将用户信息添加到列表中;当用户退出时,从列表中移除该用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!-- 在线用户监听器 -->
	<listener>
		<listener-class>com.yingjun.sharing.web.SessionListener</listener-class>
	</listener>

 

package com.yingjun.sharing.web;

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

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.yingjun.sharing.dto.SessionInfo;
import com.yingjun.sharing.model.Online;

public class SessionListener implements ServletContextListener, HttpSessionListener,HttpSessionAttributeListener {
	 
	 private ServletContext application = null ;   
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		//初始化一个application对象 
		application=sce.getServletContext();
		//设置一个列表属性,用于保存在线用户信息   
	    this.application.setAttribute("onlineList", new ArrayList<Online>()) ;
		
		
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}
	
	
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		
	}

	@Override
	@SuppressWarnings("unchecked")
	public void sessionDestroyed(HttpSessionEvent se) {
		   System.out.println("@@@@@sessionDestroyed@@@@@");
		    //获取当前在线用户列表
			List<Online> ols=(ArrayList<Online>) application.getAttribute("onlineList");
			SessionInfo sf =(SessionInfo) se.getSession().getAttribute("SessionInfo");
			if(sf!=null){
				Online ol=new Online(sf.getUsername(), sf.getIp());
				ols.remove(ol);
				System.out.println("向ServletContext中移除用户:"+sf.getUsername());
				//将删除后的列表重新设置到application属性中    
				this.application.setAttribute("online", ols) ; 
			}
			
	}
		
	

	@Override
	@SuppressWarnings("unchecked")
	public void attributeAdded(HttpSessionBindingEvent se) {
		System.out.println("@@@@@attributeAdded@@@@@");
		//获取当前在线用户列表
		List<Online> ols=(ArrayList<Online>) application.getAttribute("onlineList");
		if("SessionInfo".equals(se.getName())){
			SessionInfo sf =(SessionInfo) se.getValue();
			if (sf != null) {
				Online ol=new Online(sf.getUsername(), sf.getIp());
				ols.add(ol);
				System.out.println("向ServletContext中存入用户:"+sf.getUsername());
				//将添加后的列表重新设置到application属性中  
				application.setAttribute("onlineList", ols);
			}
		}
		
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
	
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
	}

	

	
}

 

package com.yingjun.sharing.model;

public class Online {

	
	private String name;
	private String ip;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	
	public Online() {
		super();
	}
	public Online(String name, String ip) {
		super();
		this.name = name;
		this.ip = ip;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值